我正在使用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 。 我希望我能清楚地解释我的问题,并提前感谢你的帮助!