2015-03-02 9 views
9

Używam Spring Boot i HATEOAS do budowania REST API, a kiedy mój API zwraca kolekcję, jest on zawijany wewnątrz właściwości "_embedded", tak jak:Jak usunąć właściwość _embedded w Spring HATEOAS

{ 
    "_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" 
       } 
      } 
     } 
     ] 
    } 
} 

Chcę odpowiedź będzie tak:

{ 
    "_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" 
      } 
     } 
     } 
    ] 
} 

Moja TechnologiesController:

@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; 
    } 

Klasa konfiguracji ma adnotację @EnableHypermediaSupport (type = EnableHypermediaSupport.HypermediaType.HAL).

Jaki jest najlepszy sposób uzyskania odpowiedzi bez "_embedded"?

+1

Jeśli usuniesz "_embedded" z odpowiedzi, odpowiedź nie będzie już ważna HAL. Musisz trzymać się '_embedded' lub użyć innego typu mediów. –

+0

Projekt HAL mówi "Zarezerwowana" właściwość _embedded "jest OPCJONALNA" –

+2

Jest opcjonalna, ponieważ zasób nie musi mieć żadnych zasobów osadzonych. Jeśli jednak tak się stanie, powinny znajdować się pod "_embedded". –

Odpowiedz

5

Dodanie tego Accept nagłówek na życzenie:

Accept : application/x-spring-data-verbose+json 
6

Jako documentation mówi

application/Hal + json Odpowiedzi należy przesyłać do wniosków, które akceptują application/json

Aby ominąć odpowiedź _embedded, musisz dodaj:

spring.hateoas.use-hal-as-default-json-media-type=false 

do application.properties.