经过漫长的一天,再次阅读了许多维基和常见问题解答后,它终于起作用了。
我做了以下几点:
- 使用Jackson
- 强制使用Jackson提供程序
- 定义自定义反序列化器
- 激活ACCEPT_SINGLE_VALUE_AS_ARRAY标志
- 修复依赖项
故事如下:
我一直在使用Jersey 1.13,默认情况下使用(我相信)jaxb。
我将其更改为使用Jackson
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
如下所述:
https://stackoverflow.com/a/13895768/660990
这使得我的球衣使用了Jackson,但问题仍然存在;Jackson目前无法反序列化数组。
我强制使用了
Jackson提供程序:
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>
your.project.packages
org.codehaus.jackson.jaxrs</param-value>
</init-param>
https://dev59.com/tnI95IYBdhLWcg3wsQBm#3143214
这是必要的一步,但还不够。需要激活ACCEPT_SINGLE_VALUE_AS_ARRAY标志。
ObjectMapper objectMapper
objectMapper = new ObjectMapper().configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true)
我需要定义一个自定义反序列化器。
public class MyResolver implements ContextResolver<ObjectMapper> {
@Override
public ObjectMapper getContext(final Class<?> objectType) {
...
return objectMapper;
}
}
为了做到这一点:
自定义ObjectMapper
尽管完成了所有这些,它仍然没有起作用...
经过更多的搜索时间,我找到了:
Jackson 2.0与Jersey 1.12
其中讨论了依赖问题。
这揭示了我的问题,Jersey v1.13附带了Jackson v1.9.2,我需要Jackson v2.0。
我删除了jersey-json的依赖,因为它包含了jackson 1.9.2。
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
</dependency>
直接声明依赖项:
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
</dependency>
参考:
jackson-jaxrs-json-provider
注意: 此更改将删除Jersey使用Jaxb或jettison的功能。
离题,可能对某些人有趣:
配置Jersey / Jackson以不使用@XmlElement字段注释进行JSON字段命名