Generics 如何映射Jersey客户端';s使用Jackson特性对Bean/Value对象的通用列表的响应

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

我试图使我的Rest客户机成为泛型的,这样我就可以使用同一个客户机类来实例化以检索VO列表,如书籍、作者、出版商或任何类似的VO。下面是我正在处理的泛型类,但我只得到检索到的LinkedHashMap的列表,而不是valueobject(Book)的列表。 我已使用生成rest服务

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(响应,类型);