2015-03-02 55 views
9

我正在使用Spring Boot和HATEOAS構建REST API,並且當我的API返回一個集合時,它被封裝在一個「_embedded」屬性中,如下所示:如何在Spring中刪除「_embedded」屬性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" 
       } 
      } 
     } 
     ] 
    } 
} 

我想要的迴應是這樣的:

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

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

配置類具有註釋@EnableHypermediaSupport(type = EnableHypermediaSupport.HypermediaType.HAL)。

沒有「_embedded」的情況下產生響應的最佳方式是什麼?

+1

如果您從響應中刪除_embedded,那麼響應將不再是有效的HAL。您或者需要堅持'_embedded'或使用不同的媒體類型。 – 2015-03-02 12:24:39

+0

HAL草案說「保留」_embedded「屬性是可選的」 – 2015-03-02 14:56:06

+2

它是可選的,因爲資源不必具有任何嵌入資源。但是,如果是這樣,那麼它們應該在'_embedded'下面。 – 2015-03-02 15:02:53

回答

5

添加此Accept頭請求:

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

由於documentation

應用/ HAL + JSON響應應該發送到接受 應用/ JSON請求

爲了省略_embedded你的反應,你需要add

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

to application.properties