Jackson jaxrs xml provider update issue - from 2.4.1 to 2.5.0

I am facing some issues while upgrading Jackson jaxrs xml provider from 2.4.1 to 2.5.0. I am using an xml provider in a Jersey REST API project (v1.19).

New version: com.fasterxml.jackson.jaxrs: jackson-jaxrs-xml-provider: 2.5.0

Question: Custom serializers written to customize Jackson's default serialization are not called on serialization. These custom serializers have worked since v2.4.1, and therefore, after an update, the API does not return the desired output structure.

Please find my ContextResolver implementation and custom serializer below:

XmlMapperContextResolver.java

@Provider
@Produces({MediaType.APPLICATION_XML })
public class XmlMapperContextResolver implements ContextResolver<XmlMapper> {
    private final XmlMapper animalXmlMapper = new XmlMapper();
    private final XmlMapper defaultXmlMapper = new XmlMapper();

    @Override
    public XmlMapper getContext(Class<?> type) {
        if (Animal.class.isAssignableFrom(type)) {
            return animalXmlMapper;
        }
        return defaultXmlMapper;
    }

    public XmlMapperContextResolver() {
        JacksonXmlModule module = new JacksonXmlModule();
        module.setDefaultUseWrapper(false);

        // Adding Serializers
        module.addSerializer(CharacterMap.class, new CharacterMapSerializer());

        animalXmlMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
        animalXmlMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
        animalXmlMapper.registerModule(module);


        defaultXmlMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
        defaultXmlMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
    }
}

      

CharacterMapSerializer.java

public class CharacterMapSerializer extends
        JsonSerializer<Map<String, Character>> {

    @Override
    public void serialize(Map<String, Character> value, JsonGenerator jgen,
            SerializerProvider provider) throws IOException,
            JsonProcessingException {

        provider.defaultSerializeField("Character", value.values(), jgen);
    }
}

      

CharacterMap.java

public class CharacterMap extends HashMap<String, Character> {    
}

      

At runtime it XmlMapperContextResolver

is called and it successfully returns an instance of animalXmlMapper. But when serializing, no response CharacterMapSerializer

is called, and instead Jackson uses his default serialization method to generate an XML response.

+3


source to share





All Articles