micronaut-core
micronaut-core copied to clipboard
Unable to use Jackson AfterBurner or BlackBird modules
Expected Behavior
We can use either Jackson AfterBurner or BalckBird modules.
Actual Behaviour
Adding either AfterBurner or BlackBird module in the classpath will make our Micronaut application crashing with
Caused by: java.lang.UnsupportedOperationException
at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:142)
at java.base/java.util.ImmutableCollections$ListItr.set(ImmutableCollections.java:426)
at com.fasterxml.jackson.module.afterburner.ser.SerializerModifier.findProperties(SerializerModifier.java:143)
at com.fasterxml.jackson.module.afterburner.ser.SerializerModifier.changeProperties(SerializerModifier.java:52)
at com.fasterxml.jackson.databind.ser.BeanSerializerFactory.constructBeanOrAddOnSerializer(BeanSerializerFactory.java:415)
at com.fasterxml.jackson.databind.ser.BeanSerializerFactory.findBeanOrAddOnSerializer(BeanSerializerFactory.java:295)
at com.fasterxml.jackson.databind.ser.BeanSerializerFactory._createSerializer2(BeanSerializerFactory.java:240)
at com.fasterxml.jackson.databind.ser.BeanSerializerFactory.createSerializer(BeanSerializerFactory.java:174)
at com.fasterxml.jackson.databind.SerializerProvider._createUntypedSerializer(SerializerProvider.java:1523)
at com.fasterxml.jackson.databind.SerializerProvider._createAndCacheUntypedSerializer(SerializerProvider.java:1491)
at com.fasterxml.jackson.databind.SerializerProvider.findValueSerializer(SerializerProvider.java:619)
at com.fasterxml.jackson.databind.SerializerProvider.findTypedValueSerializer(SerializerProvider.java:901)
at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.forRootType(ObjectWriter.java:1547)
at com.fasterxml.jackson.databind.ObjectWriter.<init>(ObjectWriter.java:116)
at com.fasterxml.jackson.databind.ObjectMapper._newWriter(ObjectMapper.java:840)
at com.fasterxml.jackson.databind.ObjectMapper.writerFor(ObjectMapper.java:4187)
at io.micronaut.jackson.databind.JacksonDatabindMapper.createWriter(JacksonDatabindMapper.java:147)
at io.micronaut.jackson.databind.JacksonDatabindMapper.<init>(JacksonDatabindMapper.java:101)
at io.micronaut.jackson.databind.JacksonDatabindMapper.createSpecific(JacksonDatabindMapper.java:118)
at io.micronaut.json.body.JsonMessageHandler.createSpecific(JsonMessageHandler.java:97)
at io.micronaut.http.netty.body.NettyJsonHandler.createSpecific(NettyJsonHandler.java:150)
at io.micronaut.web.router.DefaultRouteInfo.lambda$new$0(DefaultRouteInfo.java:97)
at java.base/java.util.Optional.map(Optional.java:260)
at io.micronaut.web.router.DefaultRouteInfo.<init>(DefaultRouteInfo.java:97)
at io.micronaut.web.router.DefaultMethodBasedRouteInfo.<init>(DefaultMethodBasedRouteInfo.java:75)
at io.micronaut.web.router.DefaultRequestMatcher.<init>(DefaultRequestMatcher.java:51)
at io.micronaut.web.router.DefaultUrlRouteInfo.<init>(DefaultUrlRouteInfo.java:74)
at io.micronaut.web.router.DefaultRouteBuilder$DefaultUriRoute.toRouteInfo(DefaultRouteBuilder.java:872)
at io.micronaut.web.router.DefaultRouter.<init>(DefaultRouter.java:112)
at io.micronaut.web.router.$DefaultRouter$Definition.instantiate(Unknown Source)
at io.micronaut.context.DefaultBeanContext.resolveByBeanFactory(DefaultBeanContext.java:2330)
Steps To Reproduce
No response
Environment Information
- OS: Ubutu 24.04
- Java 21
Example Application
No response
Version
4.6.3
You might have to disable the bean introspection module
if you are using the bean introspection module then afterburner and/or blackbird will provide zero benefit since the bean introspection module is already eliminating reflection. All that will be achieved in moving the byte code generation from compile time to runtime.
That said as per @yawkat if you want to use these modules for some unknown reason then you have to disable the bean introspection module
@yawkat the same issue occurs if I disable the bean introspection module.
@graemerocher we have our own Jackson mapper that we use in a bunch of places (JSONB support, Kafka, ION support, ...) I'm not sure we can use the bean instrospection module for that with the same performance advantage. Would it mandate to have all classes annotation with @Introspected to generate serializer and deserializer?
then it seems to be a Jackson bug
@graemerocher @yawkat we hit this issue again when trying to use the OpenLineage official client that uses the Blackbird module. You said that it may be a bug in Jackson itself?
except for the bean introspection module, we don't modify jackson enough to cause this error, so I don't see it being related to the framework
See https://github.com/OpenLineage/OpenLineage/issues/4049
I raised https://github.com/FasterXML/jackson-modules-base/issues/311 at JAckson side
The main bug here is IMO in the OpenLineage module.
A module should never depend on library that is a questionable Jackson optimisation that should be opt-in for the user.
Yes, agreed, I opened an issue on their side also.