Java Jackson jaxrs xml提供程序升级问题-2.4.1到2.5.0

Java Jackson jaxrs xml提供程序升级问题-2.4.1到2.5.0,java,xml,serialization,jackson,jax-rs,Java,Xml,Serialization,Jackson,Jax Rs,在将Jackson jaxrs xml提供程序从2.4.1版升级到2.5.0版时,我面临一些问题。我正在使用Jersey(v1.19)中基于RESTAPI项目的xml提供程序 新版本:com.fasterxml.jackson.jaxrs:jackson-jaxrs-xml-provider:2.5.0 问题: 为自定义默认Jackson序列化而编写的自定义序列化程序在序列化过程中不会被调用。这些自定义序列化程序使用的是v2.4.1,因此升级后API不会返回所需的输出结构 请在下面找到我的Con

在将Jackson jaxrs xml提供程序从2.4.1版升级到2.5.0版时,我面临一些问题。我正在使用Jersey(v1.19)中基于RESTAPI项目的xml提供程序

新版本:com.fasterxml.jackson.jaxrs:jackson-jaxrs-xml-provider:2.5.0

问题: 为自定义默认Jackson序列化而编写的自定义序列化程序在序列化过程中不会被调用。这些自定义序列化程序使用的是v2.4.1,因此升级后API不会返回所需的输出结构

请在下面找到我的ContextResolver ans自定义序列化程序的实现:

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);
    }
}
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);
    }
}
public class CharacterMap extends HashMap<String, Character> {    
}
@Provider
@产生({MediaType.APPLICATION_XML})
公共类XmlMapperContextResolver实现ContextResolver{
私有最终XmlMapper animalXmlMapper=新XmlMapper();
私有最终XmlMapper defaultXmlMapper=新XmlMapper();
@凌驾
公共XmlMapper getContext(类类型){
if(Animal.class.isAssignableFrom(type)){
返回animalXmlMapper;
}
返回defaultXmlMapper;
}
公共XmlMapperContextResolver(){
JacksonXmlModule模块=新的JacksonXmlModule();
module.setDefaultUseWrapper(false);
//添加序列化程序
module.addSerializer(CharacterMap.class,新的CharacterMapSerializer());
animalXmlMapper.configure(SerializationFeature.INDENT_输出,true);
animalXmlMapper.configure(SerializationFeature.WRAP\u ROOT\u值,true);
animalXmlMapper.registerModule(模块);
configure(SerializationFeature.INDENT_输出,true);
configure(SerializationFeature.WRAP_ROOT_值,true);
}
}
CharacterMapSerializer.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);
    }
}
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);
    }
}
public class CharacterMap extends HashMap<String, Character> {    
}
公共类CharacterMapSerializer扩展
JsonSerializer{
@凌驾
public void序列化(映射值,JsonGenerator jgen,
SerializerProvider提供程序)引发IOException,
JsonProcessingException{
provider.defaultSerializeField(“字符”,value.values(),jgen);
}
}
CharacterMap.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);
    }
}
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);
    }
}
public class CharacterMap extends HashMap<String, Character> {    
}
公共类CharacterMap扩展HashMap{
}

在执行过程中,调用了
XmlMapperContextResolver
,并成功返回animalXmlMapper的实例。但是在序列化响应时,
CharacterMapSerializer
不会被调用,而是Jackson应用其默认的序列化技术来构建XML响应。

最好先在Jersey/JAX-RS之外创建一个独立的测试用例。这将使我们能够确定问题是出在JAX-RS提供程序(集成)上,还是出在Jackson databind中。@dinup24您发现了吗?我也有类似的问题。