-
Notifications
You must be signed in to change notification settings - Fork 82
Closed
Labels
Description
It seems that using JaxbAnnotationModule causes some problems when using @JsonAppend
feature. Example that reproduce the issue:
@Test
public void testJsonAppendWithJaxb() throws Exception {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JaxbAnnotationModule());
String json = mapper.writeValueAsString(new Pojo("foo"));
assertEquals("{\"name\":\"foo\",\"virtual\":\"bar\"}", json);
}
@JsonAppend(props = @JsonAppend.Prop(name = "virtual", value = MyVirtualPropertyWriter.class))
public static class Pojo {
private final String name;
public Pojo(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public static class MyVirtualPropertyWriter extends VirtualBeanPropertyWriter {
public MyVirtualPropertyWriter() {
}
protected MyVirtualPropertyWriter(BeanPropertyDefinition propDef, Annotations contextAnnotations,
JavaType declaredType) {
super(propDef, contextAnnotations, declaredType);
}
@Override
protected Object value(Object bean, JsonGenerator jgen, SerializerProvider prov) throws Exception {
return "bar";
}
@Override
public VirtualBeanPropertyWriter withConfig(MapperConfig<?> config, AnnotatedClass declaringClass,
BeanPropertyDefinition propDef, JavaType type) {
return new MyVirtualPropertyWriter(propDef, declaringClass.getAnnotations(), type);
}
}
Throws exception:
java.lang.IllegalStateException: Unsupported annotated member: com.fasterxml.jackson.databind.introspect.VirtualAnnotatedMember
at com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector.findAnnotation(JaxbAnnotationIntrospector.java:1363)
at com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector.findWrapperName(JaxbAnnotationIntrospector.java:453)
at com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair.findWrapperName(AnnotationIntrospectorPair.java:435)
at com.fasterxml.jackson.databind.util.SimpleBeanPropertyDefinition.getWrapperName(SimpleBeanPropertyDefinition.java:215)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.<init>(BeanPropertyWriter.java:215)
at com.fasterxml.jackson.databind.ser.VirtualBeanPropertyWriter.<init>(VirtualBeanPropertyWriter.java:57)
at com.fasterxml.jackson.databind.ser.VirtualBeanPropertyWriter.<init>(VirtualBeanPropertyWriter.java:35)
at com.test.TestVirtualProperties$MyVirtualPropertyWriter.<init>(TestVirtualProperties.java:52)
at com.test.TestVirtualProperties$MyVirtualPropertyWriter.withConfig(TestVirtualProperties.java:64)
at com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector._constructVirtualProperty(JacksonAnnotationIntrospector.java:911)
at com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector.findAndAddVirtualProperties(JacksonAnnotationIntrospector.java:852)
at com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair.findAndAddVirtualProperties(AnnotationIntrospectorPair.java:546)
at com.fasterxml.jackson.databind.ser.BeanSerializerFactory.constructBeanSerializer(BeanSerializerFactory.java:407)
at com.fasterxml.jackson.databind.ser.BeanSerializerFactory.findBeanSerializer(BeanSerializerFactory.java:282)
at com.fasterxml.jackson.databind.ser.BeanSerializerFactory._createSerializer2(BeanSerializerFactory.java:234)
at com.fasterxml.jackson.databind.ser.BeanSerializerFactory.createSerializer(BeanSerializerFactory.java:168)
at com.fasterxml.jackson.databind.SerializerProvider._createUntypedSerializer(SerializerProvider.java:1308)
at com.fasterxml.jackson.databind.SerializerProvider._createAndCacheUntypedSerializer(SerializerProvider.java:1258)
at com.fasterxml.jackson.databind.SerializerProvider.findValueSerializer(SerializerProvider.java:500)
at com.fasterxml.jackson.databind.SerializerProvider.findTypedValueSerializer(SerializerProvider.java:698)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:270)
at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:3681)
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3057)
at com.test.TestVirtualProperties.testJsonAppendWithJaxb(TestVirtualProperties.java:28) <22 internal calls>
Also changing primary and secondary annotation introspector with:
AnnotationIntrospector jacksonAnnIntro = new JacksonAnnotationIntrospector();
AnnotationIntrospector jaxbAnnIntro = new JaxbAnnotationIntrospector();
mapper.setAnnotationIntrospector(AnnotationIntrospector.pair(jacksonAnnIntro, jaxbAnnIntro));
and it does not work.
I tested it with 2.9.1 and 2.8.8.