J'utilise des données de données de printemps pour exposer des entités sous forme de ressources de repos (paginées). Tout fonctionne bien, mais quand je demande des données via RestTemplate
, je reçois une haïssée inutile JSON (que je n'ai pas demandée). Le Json semble être une pagedresources. Je pourrais vivre avec ça, mais le Json n'est pas converti en un objet correctement. Il n'y a pas content
à l'intérieur.
Dépôt:
@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()
boucle:
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
}
}
Il semble que _embedded
n'est pas cartographié correctement au contenu ?!
Comme vous avez découvert correctement, PagedResources
n'a pas de _embedded
Propriété, c'est pourquoi vous n'obtenez pas la propriété content
peuplée.
Ce dilemme peut être résolu de deux manières différentes:
Fournir un type qui correspond à la représentation en premier lieu. Ainsi, fabriquez une classe personnalisée et collez-vous sur les noms de propriété de la représentation ou de la personnaliser à l'aide de Jackson Annotations, etc.
Configurez une personnalisation MappingJackson2HttpMessageConverter
et personnaliser le ObjectMapper
Pour obtenir le Jackson2HalModule
Configuré que Spring Hateoas est expédié de la boîte.
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));