0

我正在使用 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 注释(或者即使可能)

4

1 回答 1

0

你将无法像那样整理它。RestEasy 将查看您的class C内容,但无法确定您的响应对象是否包含 aclass A或 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,它将毫无问题地返回它。否则,它会尝试提取它,但抛出 a JsonMappingException(因此不能从 中抛出Response.getEntity()RuntimeException,此时错误将从您的class B

这已被通用化以支持任何实体类型的类提取。

于 2013-09-18T17:51:23.337 回答