2014-12-07 5 views
8

У меня проблема десериализации с помощью jeresy ClientRespone.getEntityДжерси ClientResponse.getEntity родового типа

Я пытался следовать некоторым учебникам и вопросам, включает в себя следующее: 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

и я все еще получал то же исключение снова и снова ..

Моя цель: вместо:

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

, а затем разобрать его (например, с помощью Джексона), я хочу, чтобы объект попал в мой объект POJO.

это мой tryings до сих пор:

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

серверного класса на стороне счета:

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) 

Ваша помощь будет оценена !!

ответ

21

Немногие вещи либо должны быть исправлены или добавлены (не уверен, что в вашем случае, поскольку некоторые части отсутствуют)

Ресурс: сделал свой собственный, чтобы проверить, как ваш пропускал несколько пунктов

@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

@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 
================== 

Примечание: этот тест основан на предположении, что ничего не случилось на вашем сервере боковая сторона.

+0

отличный ответ мужчина – mikebertiean