jackson-databind: Mix-ins do not work for `Enum`s
- create java enum like this
public enum SomeEnum {
none,
tax10,
tax20
}
- create mixin for enum
public enum SomeEnumMixin {
@JsonProperty("zero")
none,
@JsonProperty("TypTyp")
tax10,
@JsonProperty("PytPyt")
tax20
}
-
register mixin via
.addMixIn(SomeEnum.class, SomeEnumMixin.class)
-
try to deserialize sometithing
ObjectMapper throws NullPointerException
java.lang.NullPointerException
at com.fasterxml.jackson.databind.introspect.AnnotatedFieldCollector._addFieldMixIns(AnnotatedFieldCollector.java:117)
at com.fasterxml.jackson.databind.introspect.AnnotatedFieldCollector._findFields(AnnotatedFieldCollector.java:94)
at com.fasterxml.jackson.databind.introspect.AnnotatedFieldCollector.collect(AnnotatedFieldCollector.java:48)
at com.fasterxml.jackson.databind.introspect.AnnotatedFieldCollector.collectFields(AnnotatedFieldCollector.java:43)
at com.fasterxml.jackson.databind.introspect.AnnotatedClass._fields(AnnotatedClass.java:366)
at com.fasterxml.jackson.databind.introspect.AnnotatedClass.fields(AnnotatedClass.java:338)
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector._addFields(POJOPropertiesCollector.java:393)
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.collectAll(POJOPropertiesCollector.java:322)
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.getPropertyMap(POJOPropertiesCollector.java:287)
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.getProperties(POJOPropertiesCollector.java:186)
at com.fasterxml.jackson.databind.introspect.BasicBeanDescription._properties(BasicBeanDescription.java:164)
at com.fasterxml.jackson.databind.introspect.BasicBeanDescription.findProperties(BasicBeanDescription.java:239)
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._findCreatorsFromProperties(BasicDeserializerFactory.java:292)
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._constructDefaultValueInstantiator(BasicDeserializerFactory.java:276)
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.createEnumDeserializer(BasicDeserializerFactory.java:1472)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:371)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:349)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
at com.fasterxml.jackson.databind.DeserializationContext.findNonContextualValueDeserializer(DeserializationContext.java:481)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:497)
at com.fasterxml.jackson.databind.deser.std.DelegatingDeserializer.resolve(DelegatingDeserializer.java:58)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:293)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:491)
at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:4669)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4478)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3434)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3402)
I’ve tested on 2.11.0 and 2.11.1
About this issue
- Original URL
- State: closed
- Created 4 years ago
- Reactions: 1
- Comments: 17 (15 by maintainers)
Commits related to this issue
- Add a test for #2787, partial fix (no more NPE, now fails otherwise) — committed to FasterXML/jackson-databind by cowtowncoder 4 years ago
- Minor refactoring wrt Enum resolver construction needed for #2787 — committed to FasterXML/jackson-databind by cowtowncoder a year ago
- Improve JavaDoc wrt #2787 — committed to JooHyukKim/jackson-databind by JooHyukKim a year ago
- Update release notes wrt #2787 — committed to FasterXML/jackson-databind by cowtowncoder a year ago
- Minor post-merge clean up for #2787 — committed to FasterXML/jackson-databind by cowtowncoder a year ago
It seems this issue can be closed now, addressed by #3990 ?
Sorry. Auto-completion for the win. 😕
@cowtowncoder thankssss for the mention! Like you thought, I did try tackling already 🤣.
That time I got caught up with other PR, but now that you mention it, I will go back to it now. Do you think below method would be the right place to start?
https://github.com/FasterXML/jackson-databind/blob/95f29d2818634be6e7a396d5d2cb1d9dcb12997e/src/main/java/com/fasterxml/jackson/databind/deser/BasicDeserializerFactory.java#L1664
And possibly somewhere in that method, do introspection like…
then pass in additional lookup for the construction of an EnumDeserializer?
Ah. The problem is that unlike POJO properties that are discovered using
AnnotatedField
/-Method
and so on – on which mix-ins are applied – enum names are detected directly from fields that Enum declares, byJacksonAnnotationIntrospector
. This means mix-ins are not indeed applied.This should be fixed but will be bit bigger undertaking as it requires changes to
AnnotationIntrospector
interface, for one. That means it can not be fixed for versions earlier than 2.12.0.