我有一个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);
}
和一个驱动程序,用于测试客户端:
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,而不是尝试将其映射回Widget列表,或者我get(Class<?>)
错误地调用了该方法。有任何想法吗?
Pavel Horal的评论是正确的。如果没有已知类型,Jackson(底层反序列化器)将映射到LinkedHashMap
,因此它将返回List<LinkedHashMap>
使固定:
对于泛型类型,我们应该使用另一个get()
方法,该方法带有一个GenericType
参数。所以我们应该做类似的事情
...get(new GenericType<List<Widget>>(){});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句