Generics 如何映射Jersey客户端';s使用Jackson特性对Bean/Value对象的通用列表的响应
我试图使我的Rest客户机成为泛型的,这样我就可以使用同一个客户机类来实例化以检索VO列表,如书籍、作者、出版商或任何类似的VO。下面是我正在处理的泛型类,但我只得到检索到的LinkedHashMap的列表,而不是valueobject(Book)的列表。 我已使用生成rest服务Generics 如何映射Jersey客户端';s使用Jackson特性对Bean/Value对象的通用列表的响应,generics,jackson,apache-httpclient-4.x,jersey-2.0,jersey-client,Generics,Jackson,Apache Httpclient 4.x,Jersey 2.0,Jersey Client,我试图使我的Rest客户机成为泛型的,这样我就可以使用同一个客户机类来实例化以检索VO列表,如书籍、作者、出版商或任何类似的VO。下面是我正在处理的泛型类,但我只得到检索到的LinkedHashMap的列表,而不是valueobject(Book)的列表。 我已使用生成rest服务 public class GenericRestClient<T> { private final Client client; public GenericRestClient() { cl
public class GenericRestClient<T> {
private final Client client;
public GenericRestClient() {
client = ClientBuilder.newClient();
client.register(JacksonFeature.class);
}
private List invokeGetService(String serviceUrl){
List results = null;
try {
WebTarget webTarget = client.target(serviceUrl);
Invocation.Builder invocationBuilder =
webTarget.request(MediaType.APPLICATION_JSON_TYPE);
//response;
//If I use the class generic type variable, I am getting a List of LinkedHashMap and not List of the value object
GenericType<List<T>> responseType = new GenericType<List<T>>() {};
//Using below I am getting the list of books properly
//GenericType<List<Book>> responseType = new GenericType<List<Book>>() { };
results = invocationBuilder.get(responseType);
}catch(Exception e){
System.err.println(e.getMessage());
e.printStackTrace();
}
return results;
}
public static void main(String[] args) {
GenericRestClient<Book> restClient = new GenericRestClient<Book>();
System.out.println(restClient.invokeGetService("http://localhost:8080/library/books").get(0).toString());
}
公共类GenericRestClient{
私人最终客户;
公共GenericRestClient(){
client=ClientBuilder.newClient();
client.register(JacksonFeature.class);
}
私有列表invokeGetService(字符串服务URL){
列表结果=空;
试一试{
WebTarget WebTarget=client.target(serviceUrl);
调用生成器调用生成器=
请求(MediaType.APPLICATION\u JSON\u TYPE);
//反应;
//如果我使用类泛型类型变量,我得到的是LinkedHashMap的列表,而不是value对象的列表
GenericType responseType=新的GenericType(){};
//使用下面的方法,我可以正确地获取书籍列表
//GenericType responseType=新的GenericType(){};
结果=invocationBuilder.get(responseType);
}捕获(例外e){
System.err.println(e.getMessage());
e、 printStackTrace();
}
返回结果;
}
公共静态void main(字符串[]args){
GenericRestClient restClient=新的GenericRestClient();
System.out.println(restClient.invokeGetService(“http://localhost:8080/library/booksget(0.toString());
}
}
我的POM依赖项是
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.16</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.connectors</groupId>
<artifactId>jersey-apache-connector</artifactId>
<version>2.16</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.16</version>
</dependency>
org.glassfish.jersey.core
泽西岛客户
2.16
org.glassfish.jersey.connectors
泽西apache连接器
2.16
org.glassfish.jersey.media
泽西媒体公司
2.16
让我知道我是否可以实现它,或者使用泛型不可能实现它我通过让构造函数接受泛型并将泛型传递给invocationbuilders get方法来实现它。将对未来的读者有所帮助
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MultivaluedHashMap;
import javax.ws.rs.core.MultivaluedMap;
import java.util.Map;
import java.lang.reflect.Type;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
Gson gson = new Gson();
Type type = new TypeToken<Map<String, String>>() {
}.getType();
MultivaluedMap<String, String> formData = new MultivaluedHashMap<String, String>();
formData.add("key1", "value1");
formData.add("key1", "value2");
WebTarget webTarget = ClientBuilder.newClient().target("https://some.server.url/");
String response = webTarget.path("subpath/subpath2").request().post(Entity.form(formData), String.class);
Map<String, String> gsonResponse = gson.fromJson(response, type);
导入javax.ws.rs.client.ClientBuilder;
导入javax.ws.rs.client.Entity;
导入javax.ws.rs.client.WebTarget;
导入javax.ws.rs.core.MultivaluedHashMap;
导入javax.ws.rs.core.MultivaluedMap;
导入java.util.Map;
导入java.lang.reflect.Type;
导入com.google.gson.gson;
导入com.google.gson.reflect.TypeToken;
Gson Gson=新的Gson();
Type Type=new-TypeToken(){
}.getType();
MultivaluedMap formData=新的MultivaluedHashMap();
formData.add(“键1”、“值1”);
formData.add(“键1”、“值2”);
WebTarget WebTarget=ClientBuilder.newClient().target(“https://some.server.url/");
String response=webTarget.path(“subpath/subpath2”).request().post(Entity.form(formData),String.class);
Map gsonResponse=gson.fromJson(响应,类型);