我在使用Jeresy ClientRespone.getEntity进行反序列化时遇到问题
我试图遵循一些教程和问题,包括:http : //jersey.576304.n2.nabble.com/How-can-I-parse-a-java-util-List-lt-gt-Is- 它由泽西岛客户支持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
我仍然一遍又一遍地遇到同样的异常。
我的目标是:而不是:
response.getEntity(String.class); --> {"name":"Ben","type":"The man","id":0}
然后解析它(例如,使用杰克逊),我想将该实体放入我的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<Account> accountList = response.getEntity(new GenericType<List<Account>>() { }); 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; }
它引发以下异常:
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)
您的帮助将不胜感激!
很少需要修复或添加的内容(不确定您的情况,因为缺少某些部分)
资源: 我自己进行了测试,因为您缺少一些项目
@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(); } }
假设您具有以下依赖性:
<dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-json</artifactId> <version>${jersey-version}</version> </dependency>
测试用例: 注意客户端配置。这是必需的。
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<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()); }
帐户(客户) 类缺少一个注释。在使用字段注释时,它是必需的。另一种选择是为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 + '}'; } }
*测试 *结果 :
=== Accounts === Name: Stack, Type: Savings Name: Overflow, Type: Checkings ==================
注意: 此测试基于服务器端没有错误的假设。