как сопоставить JSON-ответ spring-data-rest с его объектом, используя RestTemplate

#spring #spring-data #spring-data-rest #spring-hateoas

#весна #spring-data #spring-data-rest #spring-ненависть

Вопрос:

У меня есть приложение spring-data-rest, которое было предоставлено с помощью REST API. Я использую этот API для создания веб-приложений. Но я не могу преобразовать этот ответ API в POJO для простоты использования. У меня следующий ответ

     {
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/persons{amp;sort,page,size}", 
      "templated" : true
    },
    "next" : {
      "href" : "http://localhost:8080/persons?page=1amp;size=5{amp;sort}", 
      "templated" : true
    }
  },
  "_embedded" : {
    "person": {
       "id": 1,
       "name": "John"
    }
  },
  "page" : { 
    "size" : 5,
    "totalElements" : 50,
    "totalPages" : 10,
    "number" : 0
  }
}

restTemplate.getForObject(uri, Person.class);
  

этот RestTemplate выдает мне следующую ошибку

     22:50:10.377 [http-bio-8080-exec-28] DEBUG c.o.x.o.accessor.XWorkMethodAccessor - Error calling method through OGNL: object: [com.foo.supply.actions.ViewPersonsAction@9756ac3] method: [viewPersons] args: [[]]
org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Unrecognized field "_embedded" (Class com.foo.support.model.Person), not marked as ignorable 
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@d4aff35; line: 2, column: 18] (through reference chain: com.foo.support.model.Person["_embedded"]); nested exception is org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "_embedded" (Class com.foo.support.model.Person), not marked as ignorable 
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@d4aff35; line: 2, column: 18] (through reference chain: com.foo.support.model.Person["_embedded"])
        at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readInternal(MappingJacksonHttpMessageConverter.java:127) ~[spring-web-3.1.0.RELEASE.jar:3.1.0.RELEASE]
        at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:153) ~[spring-web-3.1.0.RELEASE.jar:3.1.0.RELEASE]
        at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:81) ~[spring-web-3.1.0.RELEASE.jar:3.1.0.RELEASE]
        at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:446) ~[spring-web-3.1.0.RELEASE.jar:3.1.0.RELEASE]
        at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:401) ~[spring-web-3.1.0.RELEASE.jar:3.1.0.RELEASE]
        at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:199) ~[spring-web-3.1.0.RELEASE.jar:3.1.0.RELEASE]
  

Person.java

 public class Person {
    private int id;
    private String name;

    // getters and setters
}
  

Как получить объект Person из ответа? Я не хочу включать _embedded поле в мой класс Persion.

Ответ №1:

Возвращаемый тип ответа rest не Person.class является — он есть PagedResources<Person> .

Для использования RestTemplate с универсальным типом вы можете использовать следующее:

     PagedResources<Person> = restTemplate.exchange(
                    uri,
                    HttpMethod.GET,
                    null,
                    new ParametrizedReturnType()).getBody();

private static final class ParametrizedReturnType extends TypeReferences.PagedResourcesType<Person> {}
  

Комментарии:

1. Спасибо за ваш ответ. Но мой тип PagedResource является динамическим. То есть это может быть человек, сотрудник или посетитель. Я не хочу объявлять отдельный класс для всех из них. Потому что ответ может быть PagedResource<T> или Resource<T>