web-dev-qa-db-fra.com

Comment supprimer la propriété "_embedded" dans Spring HATEOAS

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

14
jose_p

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.

8
Kamill Sokol

Ajout de cet en-tête Accept à la demande:

Accept : application/x-spring-data-verbose+json
6
Jumbo N. Dejcharoen

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.

2
shenyu1997

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.

0
Stepan Mozyra