Skip to content

InaccessibleObjectException when serializing JsonLayout with JDK17+ #2814

Closed
@asanguinetti

Description

@asanguinetti

Description

When using the JsonLayout in a very simple configuration such as this:

<Console name="Console" target="SYSTEM_OUT">
  <JsonLayout/>
</Console>

There is an InaccessibleObjectException when trying to instantiate a ContextDataSerializer because its constructor is protected:

ERROR An exception occurred processing Appender Console java.lang.reflect.InaccessibleObjectException: Unable to make protected org.apache.logging.log4j.core.jackson.ContextDataSerializer() accessible: module org.apache.logging.log4j.core does not "opens org.apache.logging.log4j.core.jackson" to module com.fasterxml.jackson.databind

We are aware that JsonLayout has been marked as deprecated and there is another alternative called JsonTemplateLayout. That one works. However, our customers are still using JsonLayout in their configurations and they would like to be able to keep doing so.

Configuration

Version: Tested in 2.23.1 but probably happens on any 2.x

Operating system: Doesn't seem to matter, but tested with macOS 14.6

JDK: Tested with Temurin-17.0.11+9

Logs

2024-08-08T18:40:40.439988Z main ERROR An exception occurred processing Appender Console java.lang.reflect.InaccessibleObjectException: Unable to make protected org.apache.logging.log4j.core.jackson.ContextDataSerializer() accessible: module org.apache.logging.log4j.core does not "opens org.apache.logging.log4j.core.jackson" to module com.fasterxml.jackson.databind
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
	at java.base/java.lang.reflect.Constructor.checkCanSetAccessible(Constructor.java:188)
	at java.base/java.lang.reflect.Constructor.setAccessible(Constructor.java:181)
	at com.fasterxml.jackson.databind@2.17.2/com.fasterxml.jackson.databind.util.ClassUtil.checkAndFixAccess(ClassUtil.java:1005)
	at com.fasterxml.jackson.databind@2.17.2/com.fasterxml.jackson.databind.util.ClassUtil.findConstructor(ClassUtil.java:577)
	at com.fasterxml.jackson.databind@2.17.2/com.fasterxml.jackson.databind.util.ClassUtil.createInstance(ClassUtil.java:559)
	at com.fasterxml.jackson.databind@2.17.2/com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializerInstance(DefaultSerializerProvider.java:144)
	at com.fasterxml.jackson.databind@2.17.2/com.fasterxml.jackson.databind.ser.BasicSerializerFactory.findSerializerFromAnnotation(BasicSerializerFactory.java:547)
	at com.fasterxml.jackson.databind@2.17.2/com.fasterxml.jackson.databind.ser.BeanSerializerFactory._constructWriter(BeanSerializerFactory.java:860)
	at com.fasterxml.jackson.databind@2.17.2/com.fasterxml.jackson.databind.ser.BeanSerializerFactory.findBeanProperties(BeanSerializerFactory.java:634)
	at com.fasterxml.jackson.databind@2.17.2/com.fasterxml.jackson.databind.ser.BeanSerializerFactory.constructBeanOrAddOnSerializer(BeanSerializerFactory.java:402)
	at com.fasterxml.jackson.databind@2.17.2/com.fasterxml.jackson.databind.ser.BeanSerializerFactory.findBeanOrAddOnSerializer(BeanSerializerFactory.java:295)
	at com.fasterxml.jackson.databind@2.17.2/com.fasterxml.jackson.databind.ser.BeanSerializerFactory._createSerializer2(BeanSerializerFactory.java:240)
	at com.fasterxml.jackson.databind@2.17.2/com.fasterxml.jackson.databind.ser.BeanSerializerFactory.createSerializer(BeanSerializerFactory.java:174)
	at com.fasterxml.jackson.databind@2.17.2/com.fasterxml.jackson.databind.SerializerProvider._createUntypedSerializer(SerializerProvider.java:1525)
	at com.fasterxml.jackson.databind@2.17.2/com.fasterxml.jackson.databind.SerializerProvider._createAndCacheUntypedSerializer(SerializerProvider.java:1473)
	at com.fasterxml.jackson.databind@2.17.2/com.fasterxml.jackson.databind.SerializerProvider.findValueSerializer(SerializerProvider.java:578)
	at com.fasterxml.jackson.databind@2.17.2/com.fasterxml.jackson.databind.SerializerProvider.findTypedValueSerializer(SerializerProvider.java:856)
	at com.fasterxml.jackson.databind@2.17.2/com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:330)
	at com.fasterxml.jackson.databind@2.17.2/com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1574)
	at com.fasterxml.jackson.databind@2.17.2/com.fasterxml.jackson.databind.ObjectWriter._writeValueAndClose(ObjectWriter.java:1275)
	at com.fasterxml.jackson.databind@2.17.2/com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:1114)
	at org.apache.logging.log4j.core@2.23.1/org.apache.logging.log4j.core.layout.AbstractJacksonLayout.toSerializable(AbstractJacksonLayout.java:379)
	at org.apache.logging.log4j.core@2.23.1/org.apache.logging.log4j.core.layout.JsonLayout.toSerializable(JsonLayout.java:390)
	at org.apache.logging.log4j.core@2.23.1/org.apache.logging.log4j.core.layout.AbstractJacksonLayout.toSerializable(AbstractJacksonLayout.java:327)
	at org.apache.logging.log4j.core@2.23.1/org.apache.logging.log4j.core.layout.JsonLayout.toSerializable(JsonLayout.java:69)
	at org.apache.logging.log4j.core@2.23.1/org.apache.logging.log4j.core.layout.AbstractJacksonLayout.toSerializable(AbstractJacksonLayout.java:50)
	at org.apache.logging.log4j.core@2.23.1/org.apache.logging.log4j.core.layout.AbstractStringLayout.toByteArray(AbstractStringLayout.java:295)
	at org.apache.logging.log4j.core@2.23.1/org.apache.logging.log4j.core.layout.AbstractLayout.encode(AbstractLayout.java:207)
	at org.apache.logging.log4j.core@2.23.1/org.apache.logging.log4j.core.layout.AbstractLayout.encode(AbstractLayout.java:36)
	at org.apache.logging.log4j.core@2.23.1/org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.directEncodeEvent(AbstractOutputStreamAppender.java:227)
	at org.apache.logging.log4j.core@2.23.1/org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.tryAppend(AbstractOutputStreamAppender.java:220)
	at org.apache.logging.log4j.core@2.23.1/org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.append(AbstractOutputStreamAppender.java:211)
	at org.apache.logging.log4j.core@2.23.1/org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:160)
	at org.apache.logging.log4j.core@2.23.1/org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:133)
	at org.apache.logging.log4j.core@2.23.1/org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:124)
	at org.apache.logging.log4j.core@2.23.1/org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:88)
	at org.apache.logging.log4j.core@2.23.1/org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:705)
	at org.apache.logging.log4j.core@2.23.1/org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:663)
	at org.apache.logging.log4j.core@2.23.1/org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:639)
	at org.apache.logging.log4j.core@2.23.1/org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:575)
	at org.apache.logging.log4j.core@2.23.1/org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:92)
	at org.apache.logging.log4j.core@2.23.1/org.apache.logging.log4j.core.Logger.log(Logger.java:169)
	at org.apache.logging.log4j@2.23.1/org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2906)
	at org.apache.logging.log4j@2.23.1/org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(AbstractLogger.java:2859)
	at org.apache.logging.log4j@2.23.1/org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2841)
	at org.apache.logging.log4j@2.23.1/org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:2620)
	at org.apache.logging.log4j@2.23.1/org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:2567)
	at org.apache.logging.log4j@2.23.1/org.apache.logging.log4j.spi.AbstractLogger.warn(AbstractLogger.java:3469)
	at log4j.json.test@1.0-SNAPSHOT/org.mule.tests.Main.main(Main.java:12)

Reproduction

Attaching a minimalistic Maven project that reproduces the issue.
log4j-jsonLayout-test.zip

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugIncorrect, unexpected, or unintended behavior of existing codejpmsAffects Java module (JPMS) integrationlayoutsAffects one or more Layout plugins

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions