我有一个 Jersey/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);
}
以及用于测试客户端的驱动程序:
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());
}
}
}
当我运行这个时,我得到:
Exception in thread "main" java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.me.myapp.Widget
<stack trace omitted for brevity>
for 循环抛出异常:
for(Widget widget : widgets) {
这告诉我客户端正在工作,但我没有正确配置它。
所以任一 Jersey 都试图返回纯 JSON 并且isn't尝试将其映射回小部件列表,或者我正在调用get(Class<?>)
方法不正确。有任何想法吗?
帕维尔·霍拉尔的评论是正确的。如果没有已知类型,Jackson(底层解串器)将映射到LinkedHashMap
,所以它会返回List<LinkedHashMap>
Fix:
对于泛型类型,我们应该使用其他类型get() method https://jersey.java.net/apidocs/1.18/jersey/com/sun/jersey/api/client/WebResource.html#get%28com.sun.jersey.api.client.GenericType%29,这需要一个GenericType https://jersey.java.net/apidocs/1.18/jersey/com/sun/jersey/api/client/GenericType.html争论。所以我们应该做类似的事情
...get(new GenericType<List<Widget>>(){});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)