Skip to content

@JsonAppend causes 'IllegalStateException Unsupported annotated member' with JaxbAnnotationModule #31

@asodja

Description

@asodja

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.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions