我正在使用Jboss Resteasy和Jackson来对一个物体进行反应。问题是我连接的API要么返回一个A类型的对象,如果它是一个错误,要么返回类型B的对象列表,如果它成功的话。我的目标是让对象C如下所示:
class C {
A a;
List<B> bList;
}
然而,当我尝试这个时,我得到(在它返回成功的情况下)
Caused by: org.codehaus.jackson.map.JsonMappingException: Failed to narrow content type [collection type; class java.util.List, contains [simple type, class com.B]] with content-type annotation (com.C): Class com.C is not assignable to com.B
at org.codehaus.jackson.map.deser.BasicDeserializerFactory.modifyTypeByAnnotation(BasicDeserializerFactory.java:797)
at org.codehaus.jackson.map.deser.BeanDeserializerFactory.constructSettableProperty(BeanDeserializerFactory.java:1375)
at org.codehaus.jackson.map.deser.BeanDeserializerFactory.addBeanProps(BeanDeserializerFactory.java:1182)
at org.codehaus.jackson.map.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:707)
我只是不确定我需要什么样的@Json注释(或者即使这样可能)
答案 0 :(得分:0)
你将无法像那样整理出来。 RestEasy会查看您的class C
,但无法确定您的回复对象是否包含class A
或List<B>
。
你可以像这样解决这类交易:
public <T> T returnEntityIfValid(ClientResponse response, Class clazz) {
try {
return (T) response.getEntity(clazz);
} catch (RuntimeException ex) {
final A node = (A) response.getEntity(A.class);
throw new RuntimeException("ERROR: " + node.toString());
}
}
这个想法是我们期待一个指定的类型,但由于Response
对象模糊了我们,我们必须尝试抓住实体。如果响应对象包含您的实体class A
,它将返回它没有问题。否则,它将尝试提取它,但抛出JsonMappingException
(不能从Response.getEntity()
抛出RuntimeException
),此时将从{{1}中提取错误}}
这已被广泛用于支持任何实体类型的类提取。