2017-09-19 44 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 {...}