Java jax-rs客户端响应实体通用类型

3

我有一个通用函数的问题。我想使用一个函数,首先将特定的类/类型分配给它,从 rest 响应中生成相应的结果,然后返回它。

public class TimerService {

    [...]

    public <T extends myObjInterface> RestMessageContainer<T> send(String endpointPath, Map<String, String> parameters, Class<T> clazz) {
        [...]
        Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).get();
        RestMessageContainer<T> container = response.readEntity(new GenericType<RestMessageContainer<T>>() {});
        return container;
    }
}

public class RestMessageContainer<T extends myObjInterface> {

    [...]

    @XmlAttribute(name = "data")
    private List<T> data;

    [...]
}

我在运行时收到以下错误消息。
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct     instance of `com.test.myObjInterface` (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
14:47:41,982 ERROR [stderr] (EJB default - 2)  at [Source: (org.jboss.resteasy.client.jaxrs.internal.ClientResponse$InputStreamWrapper); line: 3, column: 14] (through reference chain: com.test.RestMessageContainer["data"]->java.util.ArrayList[0])

这个错误是针对以下这行代码输出的:RestMessageContainer<T> container = response.readEntity(new GenericType<RestMessageContainer<T>>() {});

我的做法是否正确,或者我应该如何解决这个问题?


这个回答解决了你的问题吗?Jackson JSON库:如何实例化一个包含抽象字段的类 - undefined
2个回答

1
感谢您的建议, 我有几个子类。JSON字符串中没有关于类型的信息。类型是根据请求地址确定的。我无法配置Jackson来识别子类型。JSON字符串中没有可用作类型的唯一字段。 我无法更改提供JSON字符串的网络服务。

[更新]

我找到了一个解决方案。我不再让JAX-RS客户端转换JSON字符串。我将JSON字符串作为字符串返回,并使用Jackson独立进行转换。

    public <T extends myObjInterface> RestMessageContainer<T> send(String endpointPath, Map<String, String> parameters, Class<T> clazz) {
        [...]
        Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).get();

        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
        mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

        RestMessageContainer<T> container = mapper.readValue(response.readEntity(String.class), mapper.getTypeFactory().constructParametricType(RestMessageContainer.class, clazz));

        return container;
    }

感谢您提供解决方案的更新,这对我解决使用自定义配置的对象映射器从JAX-RS响应中反序列化实体的问题非常有帮助! - undefined

0

你不能创建一个抽象类的实例。然而,你可以通过一个简单的注解来解决这个问题 - 在抽象类上使用@JsonDeserialize注解:

@JsonDeserialize(as = Cat.class)
abstract class Animal {...}

在你的情况下,抽象类应该是myObjInterface
注意:如果你有多个抽象类的子类型,那么你应该考虑包含子类型信息,就像这个post中所示的那样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接