Клиент JAXRS - проблема десериализации с Pojo

Привет Всем. Я новичок в Джерси и Джексоне, и мне очень сложно десериализовать ответ JSOn от моей службы REST на стороне клиента. Я почти уверен, что до сих пор не очень хорошо разбираюсь в API-интерфейсах Object Mapper и JSON. Любая помощь или руководство приветствуются заранее. Вот мой исходный код.

Исходный код

ПОЖО Класс

    @XmlRootElement(name = "user")
    public class User  implements Serializable{

        private String firstName;
        private String lastName;
        private String email;
        private String userID;

        public User() {

        }



        public User(String firstName, String lastName, String email, String userID) {
            this.firstName = firstName;
            this.lastName = lastName;
            this.email = email;
            this.userID = userID;
        }



        public String getFirstName() {
            return firstName;
        }
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
        public String getLastName() {
            return lastName;
        }
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
        public String getEmail() {
            return email;
        }
        public void setEmail(String email) {
            this.email = email;
        }
        public String getUserID() {
            return userID;
        }
        public void setUserID(String userID) {
            this.userID = userID;
        }



    }

Код клиента

package com.example.service.client;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.glassfish.jersey.jackson.JacksonFeature;

import com.example.service.bean.User;
import com.example.service.client.mapper.MyMessageBodyReader;
import com.example.service.client.mapper.MyObjectMapperProvider;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;


public class GetJSONResponse {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        JacksonJaxbJsonProvider provider1 = new JacksonJaxbJsonProvider();
        Client c = ClientBuilder.newClient()register(provider1);//.register(mapper); 
        WebTarget target = c.target("http://localhost:8080/RestfulWebserviceExample").path("/jaxrs/user/Nishit");

        Response resp = target.request(MediaType.APPLICATION_JSON).get();
        System.out.println(resp.getStatus());
        String user1  = resp.readEntity(String.class);
        System.out.println(user1);

        User user  = target.request(MediaType.APPLICATION_JSON).get(User.class);
        System.out.println("User : " + user.getUserID());           

    }

}

` Первые 2 sysout генерируют вывод как

200

{"user":{"firstName":"Nishit","lastName":"Ladha","email":"[email protected]","userID":"nishiz"}}

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

Exception in thread "main" javax.ws.rs.client.ResponseProcessingException: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "user" (class com.example.service.bean.User), not marked as ignorable (4 known properties: "lastName", "firstName", "email", "userID"])
 at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@10163d6; line: 1, column: 10] (through reference chain: com.example.service.bean.User["user"])
    at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:806)
    at org.glassfish.jersey.client.JerseyInvocation.access$700(JerseyInvocation.java:92)
    at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:700)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:444)
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:696)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:420)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:316)
    at com.example.service.client.GetJSONResponse.main(GetJSONResponse.java:40)
Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "user" (class com.example.service.bean.User), not marked as ignorable (4 known properties: "lastName", "firstName", "email", "userID"])

Будет очень любезно, если кто-нибудь из вас подскажет, как решить эту проблему.

Я не использую Maven, так как сначала хотел попробовать без Maven

Я не уверен, почему моя служба отдыха упаковывает ответ. Вот код:

Метод обслуживания

@GET
@Path("/{username}")    
@Produces(MediaType.APPLICATION_JSON)
public User helloWorld(@PathParam("username") String name){
    User user = new User();
    user.setFirstName("Nishit");
    user.setLastName("Ladha");
    user.setUserID("nishiz");
    user.setEmail("[email protected]");      
    return user;
}

Web.xml##

<servlet>
<description>JAX-RS Tools Generated - Do not modify</description>
<servlet-name>JAX-RS Servlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>
        com.example.service,
        com.fasterxml.jackson.jaxrs.json
    </param-value>
</init-param>
<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>


person nishiz    schedule 22.09.2015    source источник


Ответы (1)


Чувак, смотри, ты пытаешься привязать несуществующее поле Пользователь. Если вы хотите правильно разобрать этот json

{"user":{"firstName":"Nishit","lastName":"Ladha","email":"[email protected]","userID":"nishiz"}}

Вам нужно иметь аналог этого класса

public class UserWrapper implements Serializable{

    private User user;
    // Constructors
    // Getters, and setters
    // HashCode and equals
}

Тогда этот клиентский код будет работать:

public class GetJSONResponse {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        JacksonJaxbJsonProvider provider1 = new JacksonJaxbJsonProvider();
        Client c = ClientBuilder.newClient()register(provider1);//.register(mapper); 
        WebTarget target = c.target("http://localhost:8080/RestfulWebserviceExample").path("/jaxrs/user/Nishit");

        Response resp = target.request(MediaType.APPLICATION_JSON).get();
        System.out.println(resp.getStatus());
        String user1  = resp.readEntity(String.class);
        System.out.println(user1);

        UserWrapper userWrapper  = target.request(MediaType.APPLICATION_JSON).get(UserWrapper.class);          

    }

}

Если у вас есть какие-либо вопросы - просто спросите. Надеюсь, ваш код будет работать.

person Ivan Ursul    schedule 22.09.2015
comment
Спасибо Иван. Мне нужна помощь с моей службой сейчас, так как я не хочу использовать класс-оболочку. - person nishiz; 23.09.2015