web-dev-qa-db-fra.com

Pourquoi la plaque de repos ne lie pas la représentation de réponse à la pagedresources?

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 ?!

37
user3563584

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:

  1. 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.

  2. Configurez une personnalisation MappingJackson2HttpMessageConverter et personnaliser le ObjectMapperPour 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));
    
54
Oliver Drotbohm