Java 通用类型的 Jersey ClientResponse.getEntity
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/27341788/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Jersey ClientResponse.getEntity of generic type
提问by user2212726
I got a problem to deserialize using jeresy ClientRespone.getEntity
我在使用 jeresy ClientRespone.getEntity 反序列化时遇到了问题
I've tried to follow some tutorials and questions, include this: http://jersey.576304.n2.nabble.com/How-can-I-parse-a-java-util-List-lt-gt-Is-it-supported-by-the-Jersey-client-td2300852.htmlhttps://jersey.java.net/nonav/documentation/1.5/json.htmlhttp://www.programcreek.com/java-api-examples/index.php?api=com.sun.jersey.api.client.GenericType
我尝试遵循一些教程和问题,包括:http: //jersey.576304.n2.nabble.com/How-can-I-parse-a-java-util-List-lt-gt-Is- it-supported-by-the-Jersey-client-td2300852.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
and i still got the same exception over and over again..
我仍然一遍又一遍地得到同样的例外..
My goal is: instead of:
我的目标是:而不是:
response.getEntity(String.class); --> {"name":"Ben","type":"The man","id":0}
and then parse it (using Hymanson for example), I want to get the entity into my POJO object.
然后解析它(例如使用 Hymanson),我想将实体放入我的 POJO 对象中。
this is my tryings so far:
这是我到目前为止的尝试:
ServerSide:
服务器端:
@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();
}
Server side Account Class:
服务器端账户类:
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;
}
ClientSide
客户端
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<Account> accountList = response.getEntity(new GenericType<List<Account>>() {
});
System.out.println(accountList.size());
}
Client Account class:
客户账户类:
@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;
}
It throws this 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<Account>, 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<Account>, 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)
Your help will be appreciated !!
您的帮助将不胜感激!!
采纳答案by Paul Samsotha
Few things either need to be fixed or added (not sure in your case as some parts are missing)
很少有事情需要修复或添加(在您的情况下不确定,因为缺少某些部分)
Resource:Made my own to test, as yours was missing a few items
资源:让我自己测试,因为你的缺少一些项目
@Path("/")
public class AccountResource {
@GET
@Path("/account") // route to a specific method.re
@Produces(MediaType.APPLICATION_JSON)
public Response saveDataIntoHash() {
List<Account> accounts = new ArrayList<Account>();
accounts.add(new Account("Stack", "Savings"));
accounts.add(new Account("Overflow", "Checkings"));
GenericEntity generic = new GenericEntity<List<Account>>(accounts){};
return Response.status(201).entity(generic).build();
}
}
Assumed you have this dependency:
假设你有这个依赖:
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>${jersey-version}</version>
</dependency>
Test case:Notice the client configuration. This is needed.
测试用例:注意客户端配置。这是需要的。
public void testMyResource() {
ClientConfig config = new DefaultClientConfig();
config.getClasses().add(HymansonJaxbJsonProvider.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<Account> accounts
= response.getEntity(new GenericType<List<Account>>(){});
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());
}
Account (client)class is missing one annotation. It is required as you are using field annotations. Another option is to add a getter and setter for the id
帐户(客户端)类缺少一个注释。当您使用字段注释时,它是必需的。另一种选择是为id
@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 + '}';
}
}
Resultfrom test:
测试结果:
=== Accounts ===
Name: Stack, Type: Savings
Name: Overflow, Type: Checkings
==================
Note:this test is based on the assumption that nothing is wrong on your server side.
注意:此测试基于您的服务器端没有任何问题的假设。