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

IAm*_*aja 4 java generics json jax-rs jersey

我有一个Jersery/JAX-RS客户端,它可以访问一个RESTful API(JSON),它应该返回我的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);
}
Run Code Online (Sandbox Code Playgroud)

以及用以下方法测试客户端的驱动程序:

public class Driver {
    public static void main(String[] args) {
        Driver d = new Driver();
        d.run();
    }

    public void run() {
        MyAppService myService = getSomehow();

        List<Widget> widgets = myService.getWidgetResource().getWidgetsByUser(2L);
        for(Widget widget : widgets) {
            System.out.println("\t...and it found Widget #" + widget.getCaseId());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我得到:

Exception in thread "main" java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.me.myapp.Widget
    <stack trace omitted for brevity>
Run Code Online (Sandbox Code Playgroud)

从for循环中抛出异常:

for(Widget widget : widgets) {
Run Code Online (Sandbox Code Playgroud)

这告诉我客户端有点工作,但我没有正确配置它.

所以要么泽西岛试图返回纯JSON并且没有尝试将它映射回小部件列表,要么我正在调用该get(Class<?>)方法不正确.有任何想法吗?

Pau*_*tha 7

Pavel Horal的评论是正确的.没有已知的类型,杰克逊(潜在的deserilaizer)将映射到LinkedHashMap,所以它将返回List<LinkedHashMap>

固定:

对于泛型类型,我们应该用其他的get()方法,这需要一个GenericType说法.所以我们应该做点什么

...get(new GenericType<List<Widget>>(){});
Run Code Online (Sandbox Code Playgroud)