Jersey ClientResponse.getEntity di tipo generico

Ho avuto un problema di deserializzare usando jeresy ClientRespone.getEntity

Ho provato a seguire alcuni tutorial e domande, includendo questo: http://jersey.576304.n2.nabble.com/How-can-I-parse-a-java-util-List-lt-gt-Is- it-support-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

e ho ancora la stessa eccezione ancora e ancora.

Il mio objective è: invece di:

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

e poi analizzarlo (usando Jackson per esempio), voglio portare l’entity framework nel mio object POJO.

questo è il mio tentativo finora:

Lato server:

 @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(); } 

Classe account lato server:

 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; } 

Dalla parte del cliente

 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()); } 

Classe account cliente:

 @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; } 

Genera questa eccezione:

 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) 

Il tuo aiuto sarà apprezzato !!

Poche cose devono essere aggiustate o aggiunte (non è sicuro nel tuo caso perché mancano alcune parti)

Risorsa: fatto mio per testare, in quanto alla tua mancavano alcuni elementi

 @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(); } } 

Supposto tu abbia questa dipendenza:

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

Test case: si noti la configurazione del client. Questo è necessario

 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()); } 

La class Account (client) manca di un’annotazione. È richiesto quando si utilizzano annotazioni sul campo. Un’altra opzione è aggiungere un getter e setter per l’ 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 + '}'; } } 

Risultato dalla prova:

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

Nota: questo test si basa sul presupposto che nulla è sbagliato sul lato server.