2017-09-19 43 views
0

這一次我真的很困惑和卡住... 我正在春季啓動(1.5.3)應用程序公開HAL風格的REST API使用spring-討厭的圖書館。一些端點已經正確工作並返回HAL鏈接。目前我正在嘗試更改另一個端點以使用HAL返回響應,但結果以"collection+json"樣式序列化。HAL風格的渲染問題與春天仇恨

我發現迄今: 有在Spring上下文3個ObjectMapper實例:

  • objectMapper
  • _halObjectMapper
  • halObjectMapper

我轉換了所有三個響應這些,發現前兩個產生"collection+json"輸出("links""rel"),第三個產生預期的HAL風格("_links"沒有"rel")。

爲什麼有三個,我該如何檢查和控制這些objectMappers中的哪一個被用來呈現響應?我的其他終端如何返回預期的格式?


這裏是我的簡化代碼,在情況下,它的任何權益:

@RestController 
public class SearchController{ 

    @RequestMapping(value = "/search", produces = { "application/hal+json" }, method = RequestMethod.GET) 
    public ResponseEntity<SearchResponse> search(...){ 
     SearchResponse searchResponse = ...; // search & build response 
     return new ResponseEntity<>(searchResponse, HttpStatus.OK); 
    } 
} 

public class SearchResponse { 

    @JsonProperty("_meta") 
    private PageSortInfo meta; 

    @JsonUnwrapped 
    private Resources<Resource<SearchResultItem>> resultlist; 

    ...// getters & setters 
} 

的反應應該是這個樣子:

{ 
    "_meta" : { 
     ... 
    }, 
    "_embedded" : { 
     "searchResultItemList" : [ { 
     ..., 
     "_links" : { 
      "self" : { 
      "href" : "..." 
      } 
     } 
     }, 
     ... 
     ] 
    }, 
    "_links" : { 
     "self" : { 
     "href" : "http://localhost:8882/api/search" 
     } 
    } 
} 

回答

0

好,之後通過挖的另一天谷歌搜索結果,sprint-boot代碼和大量試用&錯誤我終於找到了答案,這當然是微不足道的:

Spring會選擇MessageConverter,用於通過將註冊的轉換器與對象的類型(在我的情況下爲SearchResponse)和響應類型(對我來說爲"application/hal+json")進行匹配,將響應對象轉換爲適當的格式。僅當響應對象是ResourceSupport類型時纔會選擇halJacksonHttpMessageConverter。所以我所要做的就是讓我的SearchResponse延伸ResourceSupport,我得到了預期的響應格式。

public class SearchResponse extends ResourceSupport {...}