Java 为什么Jersey/JAX-RS客户端无法处理泛型?

Java 为什么Jersey/JAX-RS客户端无法处理泛型?,java,json,generics,jersey,jax-rs,Java,Json,Generics,Jersey,Jax Rs,我有一个Jersery/JAX-RS客户机,它访问一个RESTful API(JSON),该API应该返回我的POJO列表: // Hits: GET localhost:8080/myapp/fizz/widget/{widget_id} @Override public List<Widget> getWidgetsByUser(Long id) { return webResource.path("fizz").path("widget").path(id.toStri

我有一个Jersery/JAX-RS客户机,它访问一个RESTful API(JSON),该API应该返回我的POJO列表:

// Hits: GET localhost:8080/myapp/fizz/widget/{widget_id}
@Override
public List<Widget> getWidgetsByUser(Long id) {
    return webResource.path("fizz").path("widget").path(id.toString()).get(List.class);
}
这告诉我客户端可以正常工作,但我没有正确配置它


因此,要么Jersey试图返回纯JSON,而没有尝试将其映射回小部件列表,要么我错误地调用了
get(Class)
方法。有什么想法吗?

帕维尔·霍拉尔的评论是正确的。如果没有已知类型,Jackson(底层反序列化程序)将映射到
LinkedHashMap
,因此它将返回
List

修正:

对于泛型类型,我们应该使用另一个,它接受一个参数。所以我们应该做一些类似的事情

...get(new GenericType<List<Widget>>(){});
…获取(新的GenericType(){});

这很容易理解-您正在告诉Jersey(可能有Jackson在下面)将响应正文转换为
列表
。除了为列表元素选择框架想要使用的内容之外,您还能指望框架做什么呢?谢谢@PavelHolal(+1)-那么我如何配置Jersey以返回
列表
?您可以通过引入
WidgetCollection
对象来解决这个问题,并将列表作为其属性(我会说这是一种常见的做法)。除此之外,我会浏览Jersey的文档。但您可能最终会阅读Jackson解决此问题的方法(
TypeReference
)——但这可能不会影响Jersey的API。
Exception in thread "main" java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.me.myapp.Widget
    <stack trace omitted for brevity>
for(Widget widget : widgets) {
...get(new GenericType<List<Widget>>(){});