在序列化期间,Jackson忽略了XmlElement

时间:2014-09-08 22:13:43

标签: java json annotations jackson

我正在使用Jersey来构建一个REST服务,而作为Json Processor我在我的应用程序中设置了Jackson。

@javax.ws.rs.ApplicationPath("/")
public class MyApplication extends ResourceConfig {
   public MyApplication() {
       packages("controller");
       register(JacksonFeature.class);
}

我为Jacksons ContextResolver实现ObjectMapper(正如本文Configure Jersey/Jackson to NOT use @XmlElement field annotation for JSON field naming中所建议的那样),它创建了一个在反序列化过程中不会在未知属性上失败的ObjectMapper:

@Provider
public class MyJsonObjectMapperProvider implements ContextResolver<ObjectMapper> {

    @Override
    public ObjectMapper getContext(Class<?> type) 
    {
        System.out.println("mapper!!!");
        ObjectMapper result = new ObjectMapper();
        result.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        return result;
    }
}

然后我在我的应用程序中注册此类,在上面显示的类register(MyJsonObjectMapperProvider.class)中插入MyApplication。我得到了我想要的东西,从某种意义上讲,如果json中存在未知属性,则对象映射器不会失败。 我的问题是另一个问题我有这个类用于映射指定的Json,以便反序列化它,然后序列化它:

public class Version {

    private String status;
    private String updated;
    private String id;
    private List<Link> links;
    @XmlElement(name = "media-types")
    private List<MediaTypes> media_types;

    //constructor + getter and setter
}

问题在于 media_types 元素以及注释 @XmlElement 的使用。在我插入ContextResolver以个性化ObjectMapper之前一切正常,事实上在序列化之后,我获得了一个json,其中元素/属性 media_types 具有名称​​ media-types ;与ContextResolver相反,此元素不会更改其名称,并且具有 media_types 。我认为,在序列化期间,注释 XmlElement 不起作用,但我不确定这是正确的原因。 我尝试做的另一个尝试是放置 @JsonProperty(“media-types”)注释而不是 @XmlElement 注释但没有结果;事实上,通过这个注释我也获得了一个处理异常。 最后一次尝试(除了上一篇文章所建议的内容)是在ContextResolver中插入这些代码行:

AnnotationIntrospector intr = new AnnotationIntrospector.Pair(new JaxbAnnotationIntrospector(),new JacksonAnnotationIntrospector());
            // usually we use same introspector(s) for both serialization and deserialization:
            result.getDeserializationConfig().withAnnotationIntrospector(intr);
            result.getSerializationConfig().withAnnotationIntrospector(intr);

要同时使用JaxbAnnotation和JacksonAnnotation,但相关字段的名称仍为 media_types 。 我希望我能清楚地解释我的问题,并提前感谢你的帮助!

0 个答案:

没有答案