2014-12-07 20 views
8

ho avuto un problema di deserializzare utilizzando ClientRespone.getEntity jeresyJersey ClientResponse.getEntity di tipo generico

Ho provato a seguire alcuni tutorial e le domande, includere questo: 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

e ho ancora avuto la stessa eccezione più e più volte ..

il mio obiettivo è: invece di:

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

e quindi analizzarlo (utilizzando Jackson per esempio), voglio ottenere l'entità nel mio oggetto POJO.

questo è il mio tryings finora:

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 account lato Classe:

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

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

Si 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<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) 

Il vostro aiuto sarà apprezzato !!

risposta

21

Poche cose o hanno bisogno di essere fisso o aggiunto (non è sicuro nel suo caso come alcune parti sono mancanti)

risorse: fatto il mio per testare, come il vostro mancava alcuni articoli

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

Assunta si dispone di questa dipendenza:

<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-json</artifactId> 
    <version>${jersey-version}</version> 
</dependency> 

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<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) classe manca un'annotazione. È richiesto quando si utilizzano annotazioni sul campo. Un'altra opzione è quella di aggiungere un getter e setter per la 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 da prova:

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

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

+0

great answer man – mikebertiean