J'utilise Spring Boot et HATEOAS pour créer une API REST. Lorsque cette API renvoie une collection, celle-ci est encapsulée dans une propriété "_embedded", comme suit:
{
"_links":{
"self":{
"href":"http://localhost:8080/technologies"
}
},
"_embedded":{
"technologies":[
{
"id":1,
"description":"A",
"_links":{
"self":{
"href":"http://localhost:8080/technologies/1"
}
}
},
{
"id":2,
"description":"B",
"_links":{
"self":{
"href":"http://localhost:8080/technologies/2"
}
}
}
]
}
}
Je veux que la réponse soit comme ça:
{
"_links":{
"self":{
"href":"http://localhost:8080/technologies"
}
},
"technologies":[
{
"id":1,
"description":"A",
"_links":{
"self":{
"href":"http://localhost:8080/technologies/1"
}
}
},
{
"id":2,
"description":"B",
"_links":{
"self":{
"href":"http://localhost:8080/technologies/2"
}
}
}
]
}
Mes technologiesContrôleur:
@RestController
@ExposesResourceFor(Technology.class)
@RequestMapping(value = "/technologies")
public class TechnologiesController {
...
@ResquestMapping(method = RequestMethod.GET, produces = "application/vnd.xpto-technologies.text+json")
public Resources<Resource<Technology>> getAllTechnologies() {
List<Technology> technologies = technologyGateway.getAllTechnologies();
Resources<<Resource<Technology>> resources = new Resources<Resource<Technology>>(technologyResourceAssembler.toResources(technologies));
resources.add(linkTo(methodOn(TechnologiesController.class).getAllTechnologies()).withSelfRel());
return resources;
}
La classe de configuration a l'annotation @EnableHypermediaSupport (type = EnableHypermediaSupport.HypermediaType.HAL).
Quelle est la meilleure façon de produire la réponse sans "_embedded"?
Comme le dit documentation
les réponses application/hal + json doivent être envoyées aux demandes qui acceptent application/json
Pour omettre _embedded
dans votre réponse, vous devez ajouter
spring.hateoas.use-hal-as-default-json-media-type=false
à application.properties
.
Ajout de cet en-tête Accept
à la demande:
Accept : application/x-spring-data-verbose+json
Je ferme la fonctionnalité HAL, car il est difficile d’utiliser Ressources/Resource by restTemplate. Je désactive cette fonctionnalité en suivant le code:
public class SpringRestConfiguration implements RepositoryRestConfigurer {
@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
config.setDefaultMediaType(MediaType.APPLICATION_JSON);
config.useHalAsDefaultJsonMediaType(false);
}
}
Ça marche pour moi. HAL est bon s’il ya plus de support avec restTemplate.
Recherchez ceux qui utilisent Spring Data et considérez-le comme un problème - la solution consiste à définir
spring.data.rest.defaultMediaType = application/json
dans les propriétés d'application. Il y aura toujours des liens, mais plus _ incorporés.