我对通用函数有疑问。我想使用分配了特定类/类型的函数,以便首先从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>>() {});
我的方法是完全正确的还是应该解决我的问题?
您无法创建抽象类的实例。但是,您可以通过简单的注释来解决问题–抽象类上的@JsonDeserialize
:
@@ JsonDeserialize(as = Cat.class)抽象类动物{...}
在您的情况下,抽象类为myObjInterface
。
注意:如果抽象类有多个子类型,则应考虑包括此post中所示的子类型信息。