Jersey ClientResponse.getEntity的generics类型

我遇到了使用jeresy ClientRespone.getEntity反序列化的问题

我试图遵循一些教程和问题,包括: http : //jersey.576304.n2.nabble.com/How-can-I-parse-a-java-util-List-lt-gt-Is-它支持泽西客户端-tdd2300852.html https://jersey.java.net/nonav/documentation/1.5/json.html http://www.programcreek.com/java-api-examples/的index.php?API = com.sun.jersey.api.client.GenericType

我仍然一遍又一遍地得到同样的例外

我的目标是:而不是:

response.getEntity(String.class); --> {"name":"Ben","type":"The man","id":0} 

然后解析它(例如使用Jackson),我想让实体进入我的POJO对象。

到目前为止,这是我的尝试:

服务器端:

 @POST @Path("/account") // route to a specific method.re @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response saveDataIntoHash(Account account) { Account createdAccount = new Account(account.getName(), account.getType()); accountHash.put(createdAccount.getID(), createdAccount); return Response.status(201).entity(new AccountResponse(createdAccount.getID())).build(); } 

服务器端帐户类:

 private String name; private String type; private int ID; private static int classID = 0; public Account(String name, String type) { this.name = name; this.type = type; this.ID = classID++; } public Account() { } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setType(String type) { this.type = type; } public String getType() { return type; } public int getID() { return ID; } public void setID(int ID) { this.ID = ID; } public static int getClassID() { return classID; } public static void setClassID(int classID) { Account.classID = classID; } 

客户端

 private static void getToRestPartner(Client client) { WebResource webResource = client.resource("http://localhost:8080/RESTfulExample/rest/account/0"); ClientResponse response = webResource.type("application/json").get(ClientResponse.class); if (!(response.getStatus() == 201 || response.getStatus() == 200)) { throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); } System.out.println("Output from Server .... \n"); List accountList = response.getEntity(new GenericType<List>() { }); System.out.println(accountList.size()); } 

客户帐户类:

 @XmlRootElement public class Account { @XmlElement private String name; @XmlElement private String type; @XmlElement private int id; public Account(String name, String type, Integer id) { this.name = name; this.type = type; this.id = id; } public Account() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } public int getId() { return id; } public void setId(int id) { this.id = id; } 

它抛出了这个exception:

 Dec 7, 2014 12:15:58 PM com.sun.jersey.api.client.ClientResponse getEntity SEVERE: A message body reader for Java class java.util.List, and Java type java.util.List, and MIME media type application/json was not found Dec 7, 2014 12:15:58 PM com.sun.jersey.api.client.ClientResponse getEntity SEVERE: The registered message body readers compatible with the MIME media type are: */* -> com.sun.jersey.core.impl.provider.entity.FormProvider com.sun.jersey.core.impl.provider.entity.StringProvider com.sun.jersey.core.impl.provider.entity.ByteArrayProvider com.sun.jersey.core.impl.provider.entity.FileProvider com.sun.jersey.core.impl.provider.entity.InputStreamProvider com.sun.jersey.core.impl.provider.entity.DataSourceProvider com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General com.sun.jersey.core.impl.provider.entity.ReaderProvider com.sun.jersey.core.impl.provider.entity.DocumentProvider com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General com.sun.jersey.core.impl.provider.entity.EntityHolderReader Exception in thread "main" com.sun.jersey.api.client.ClientHandlerException: A message body reader for Java class java.util.List, and Java type java.util.List, and MIME media type application/json was not found at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:549) at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:523) at com.sample.Sample.getToRestPartner(Sample.java:59) at com.sample.Sample.main(Sample.java:22) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) 

我们将不胜感激!

很少有东西需要修复或添加(在你的情况下不确定,因为缺少某些部分)

资源:由我自己测试,因为你缺少一些项目

 @Path("/") public class AccountResource { @GET @Path("/account") // route to a specific method.re @Produces(MediaType.APPLICATION_JSON) public Response saveDataIntoHash() { List accounts = new ArrayList(); accounts.add(new Account("Stack", "Savings")); accounts.add(new Account("Overflow", "Checkings")); GenericEntity generic = new GenericEntity>(accounts){}; return Response.status(201).entity(generic).build(); } } 

假设你有这种依赖:

  com.sun.jersey jersey-json ${jersey-version}  

测试用例:注意客户端配置。 这是必要的。

 public void testMyResource() { ClientConfig config = new DefaultClientConfig(); config.getClasses().add(JacksonJaxbJsonProvider.class); config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); Client c = Client.create(config); WebResource resource = c.resource(Main.BASE_URI); ClientResponse response = resource.path("account") .accept("application/json").get(ClientResponse.class); List accounts = response.getEntity(new GenericType>(){}); StringBuilder builder = new StringBuilder("=== Accounts ===\n"); for (Account account: accounts) { builder.append("Name: ").append(account.getName()).append(", ") .append("Type: ").append(account.getType()).append("\n"); } builder.append("=================="); System.out.println(builder.toString()); } 

帐户(客户端)类缺少一个注释。 当您使用字段注释时,它是必需的。 另一个选择是为id添加getter和setter

 @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) // <======= This Here public class Account { // added toString for testing @Override public String toString() { return "Account{" + "name=" + name + ", type=" + type + ", id=" + id + '}'; } } 

测试结果

 === Accounts === Name: Stack, Type: Savings Name: Overflow, Type: Checkings ================== 

注意:此测试基于服务器端没有任何错误的假设。