我正在尝试将JSON数组放入JAX-RS服务(使用Jackson作为JSON提供程序)。该服务声明如下:
@PUT
public Response setList(List<MyPojo> pojoList) {
...
}
调用此方法时,pojoList
的成员的类型为LinkedHashMap
,而不是MyPojo
。因此杰克逊将列表反序列化为一般的“地图列表”,而不是使用声明的类型。
我知道杰克逊能够在直接使用ObjectMapper
时对反序列表进行反序列化。但是,如果通过JAX-RS使用它,杰克逊怎么能这样做呢?我是否缺少一个特殊的@Json...
注释?
答案 0 :(得分:1)
我刚刚发现这是使用CDI拦截器的副作用(至少在使用WELD作为CDI提供程序时)。 CDI拦截器使用的代理类会破坏方法参数的泛型信息。
因此CDI代理会导致
public Response setList(List<MyPojo> pojoList) {
...
}
显示为
public Response setList(List pojoList) {
...
}
到Resteasy(=我们的JAX-RS提供商)。因此,它被反序列化为杰克逊的“地图列表”。删除拦截器解决了这个问题,但不幸的是,这对我们来说不是一个可行的选择。