我有几个客户机类通过put方法向jersey webservice发送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");

所以,为什么我不能在类内部生成泛型类型的泛型实体,但在外部执行却可以?

最佳答案

类genericentity用于绕过java的类型擦除。在创建泛型实例时,jersey尝试获取类型信息。
在第一个示例中,用list类型的参数T调用泛型构造函数,在第二个示例中用systemInfoList参数调用泛型构造函数,这似乎提供了更好的类型信息。我不知道GenericEntity构造函数在内部做什么,但由于Java的类型擦除,这两种情况似乎有所不同。
试图绕过类型擦除是不明智的,因为这些解决方案通常不起作用。您可以责怪jersey尝试了这一点(或者责怪sun/oracle删除了类型)。

10-06 01:40