为什么RestTemplate不将响应表示绑定到PagedResources?
我正在使用spring-data-rest将实体公开为(分页的)rest资源。一切正常,但是当我通过请求数据时RestTemplate,我得到了一个无用的HATEOAS JSON(我没有要求)。JSON似乎是PagedResources
。我可以接受,但是JSON无法正确转换为对象。没有content
里面。
Repository:
@RepositoryRestResource(collectionResourceRel = "people", path = "people")public interface PersonRepository extends PagingAndSortingRepository<Person, Long>
{
List<Person> findByLastName(@Param("name") String name);
}
Client:
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()
curl:
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
填充该属性的原因。
这个难题可以通过两种不同的方式解决:
首先提供与表示形式匹配的类型。因此,可以制作一个自定义类,并坚持表示的属性名称,或者使用Jackson批注等对它进行自定义。
设置一个自定义
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));
以上是 为什么RestTemplate不将响应表示绑定到PagedResources? 的全部内容, 来源链接: utcz.com/qa/411000.html