这次我真的很困惑并且坚持了......
我正在开发一个spring-boot(1.5.3)应用程序,该应用程序使用spring-hateoas库公开具有HAL样式的REST API。某些端点已正常工作并返回HAL链接。目前,我尝试更改另一个端点以使用HAL返回响应,但结果以"collection+json"
样式序列化。
到目前为止我发现了什么:
弹簧上下文中有3个ObjectMapper
个实例:
objectMapper
_halObjectMapper
halObjectMapper
我用所有这三个转换了响应,发现前两个产生"collection+json"
输出("links"
和"rel"
),第三个产生预期的HAL样式({{ 1}}没有"_links"
)。
为什么有三个,我如何检查和控制哪些objectMapper用于呈现响应?我的其他端点如何返回预期的格式?
这是我的简化代码,万一感兴趣:
"rel"
响应应该如下所示:
@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
}
答案 0 :(得分:0)
好吧,经过谷歌搜索结果,sprint-boot代码和大量试用版之后的另一天。错误我终于找到了答案,这当然是微不足道的:
Spring将选择用于将响应对象转换为适当格式的MessageConverter
,方法是将已注册的转换器与对象的类型(在我的情况下为SearchResponse
)和响应类型({{ 1}}对我来说)。仅当响应对象的类型为"application/hal+json"
时,才会选择halJacksonHttpMessageConverter
。所以我所要做的就是让ResourceSupport
扩展SearchResponse
并获得预期的响应格式。
ResourceSupport