programing

RestTemplate가 응답 표현을 PagedResources에 바인드하지 않는 이유는 무엇입니까?

powerit 2023. 2. 22. 23:17
반응형

RestTemplate가 응답 표현을 PagedResources에 바인드하지 않는 이유는 무엇입니까?

spring-data-rest를 사용하여 엔티티를 (페이징된) rest 리소스로 노출하고 있습니다.모든 것이 정상 작동하지만, 제가 데이터를 요청했을 때RestTemplate쓸모없는 하테오아스 JSON(요청하지 않은 것)을 얻습니다.JSON은 Paged Resources인 것 같습니다.그건 감수하고 살 수 있는데 JSON이 물건으로 올바르게 변환되지 않았어요.거기에는 없다content안에서.

저장소:

@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface PersonRepository extends PagingAndSortingRepository<Person, Long>
{
    List<Person> findByLastName(@Param("name") String name);
}

클라이언트:

public List<Person> getPersons()
{
    RestTemplate rt = new RestTemplate();
    System.out.println(rt.getForObject(URL, PagedResources.class).getContent().size());
    System.out.println(rt.getForObject(URL, PagedResources.class).getLinks().size());
    System.out.println(rt.getForObject(URL, PagedResources.class).getMetadata().getTotalElements());
    return new ArrayList<Person>(rt.getForObject(URL, PagedResources.class).getContent()); // <-- empty
}

System.out:

0 // getContent().size()
4 // getLinks().size()
2 // getTotalElements()

컬:

C:\...>curl http://localhost:8080/spring-jsf-rest/rest/people
{
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/spring-jsf-rest/rest/people{?page,size,sort}",
      "templated" : true
    },
    "search" : {
      "href" : "http://localhost:8080/spring-jsf-rest/rest/people/search"
    }
  },
  "_embedded" : {
    "people" : [ {
      "firstName" : "John",
      "lastName" : "Rambo",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/spring-jsf-rest/rest/people/1"
        }
      }
    }, {
      "firstName" : "Chuck",
      "lastName" : "Norris",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/spring-jsf-rest/rest/people/2"
        }
      }
    } ]
  },
  "page" : {
    "size" : 20,
    "totalElements" : 2,
    "totalPages" : 1,
    "number" : 0
  }
}

인 것 같다_embedded콘텐츠에 올바르게 매핑되지 않았습니까?

당신이 정확히 발견했듯이,PagedResources를 가지고 있지 않다_embedded부동산, 그래서 당신은 그 정보를 얻을 수 없는 겁니다.content속성이 입력되었습니다.

이 딜레마는 다음 두 가지 방법으로 해결할 수 있습니다.

  1. 애초에 표현과 일치하는 유형을 제공합니다.따라서 사용자 정의 클래스를 만들고 표현의 속성 이름을 고수하거나 잭슨 주석 등을 사용하여 사용자 정의하십시오.

  2. 커스텀 설정MappingJackson2HttpMessageConverter커스터마이즈하여ObjectMapper을 손에 넣다Jackson2HalModuleSpring HATEOAS가 개봉 후 출하되도록 설정되어 있습니다.

    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    mapper.registerModule(new Jackson2HalModule());
    
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    converter.setSupportedMediaTypes(MediaType.parseMediaTypes("application/hal+json"));
    converter.setObjectMapper(mapper);
    
    RestTemplate template = new RestTemplate(Collections.<HttpMessageConverter<?>> singletonList(converter));
    

언급URL : https://stackoverflow.com/questions/23239052/why-does-resttemplate-not-bind-response-representation-to-pagedresources

반응형