3

我有几个客户端类通过 PUT 方法将 bean 列表发送到球衣网络服务,因此我决定使用泛型将它们重构为一个类。我的第一次尝试是这样的:

public void sendAll(T list,String webresource) throws ClientHandlerException {
    WebResource ws = getWebResource(webresource);
    String response = ws.put(String.class, new GenericEntity<T>(list) {});
}

但是当我用以下方式调用它时:

WsClient<List<SystemInfo>> genclient = new WsClient<List<SystemInfo>>();
genclient.sendAll(systemInfoList, "/services/systemInfo");

它给了我这个错误:

com.sun.jersey.api.client.ClientHandlerException: A message body writer for Java type, class java.util.ArrayList, and MIME media type, application/xml, was not found

所以我尝试取出 GenericEntity 声明的方法,它可以工作:

public void sendAll(T list,String webresource) throws ClientHandlerException {
 WebResource ws = ws = getWebResource(webresource);
 String response = ws.put(String.class, list);
}

调用它:

 WsClient<GenericEntity<List<SystemInfo>>> genclient = new WsClient<GenericEntity<List<SystemInfo>>>();
 GenericEntity<List<SystemInfo>> entity;
 entity = new GenericEntity<List<SystemInfo>>(systemInfoList) {};
 genclient.sendAll(entity, "/services/systemInfo");

那么,为什么我不能在类中生成泛型类型的泛型实体,而在外部生成呢?

4

1 回答 1

1

GenericEntity 类用于绕过 Java 的类型擦除。在创建 GenericEntity 实例时,Jersey 会尝试获取类型信息。

list在第一个示例中,使用type的参数调用 GenericEntity 构造函数T,在第二个示例中,使用参数调用它systemInfoList,这似乎提供了更好的类型信息。我不知道 GenericEntity 构造函数在内部做什么,但由于 Java 的类型擦除,这两种情况似乎不同。

尝试绕过类型擦除绝不是明智之举,因为这些解决方案通常不起作用。您可以责怪 Jersey 尝试这样做(或责怪 Sun/Oracle 的类型擦除)。

于 2012-05-22T16:14:16.963 回答