spring-hateoas 的 HAL 风格渲染问题
HAL-style rendering issues with spring-hateoas
这次真的是一头雾水,一头雾水...
我正在开发一个 spring-boot (1.5.3) 应用程序,使用 spring-hateoas 库公开一个具有 HAL 风格的 REST API。一些端点已经正常工作并且 return HAL 链接。目前我正在尝试将另一个端点更改为也 return 使用 HAL 的响应,但结果以 "collection+json"
样式序列化。
到目前为止我发现了什么:
spring 上下文中有 3 个 ObjectMapper
实例:
objectMapper
_halObjectMapper
halObjectMapper
我用所有这三个转换了响应,发现前两个产生 "collection+json"
输出("links"
和 "rel"
),第三个产生预期的 HAL 样式( "_links"
没有 "rel"
).
为什么有三个?我如何检查和控制这些 objectMappers 中的哪一个用于呈现响应?我的其他端点怎么可能 return 预期格式?
这是我的简化代码,如果您对它感兴趣的话:
@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"
}
}
}
好吧,经过又一天的挖掘 google 搜索结果、sprint-boot 代码和大量的反复试验,我终于找到了答案,这当然是微不足道的:
Spring 将选择 MessageConverter
用于将响应对象转换为适当的格式,方法是将已注册的转换器与对象的类型相匹配(在我的例子中为 SearchResponse
)和响应类型("application/hal+json"
对我来说)。仅当响应对象的类型为 ResourceSupport
时,才会选择 halJacksonHttpMessageConverter
。所以我所要做的就是让我的 SearchResponse
扩展 ResourceSupport
并且我得到了预期的响应格式。
public class SearchResponse extends ResourceSupport {...}
这次真的是一头雾水,一头雾水...
我正在开发一个 spring-boot (1.5.3) 应用程序,使用 spring-hateoas 库公开一个具有 HAL 风格的 REST API。一些端点已经正常工作并且 return HAL 链接。目前我正在尝试将另一个端点更改为也 return 使用 HAL 的响应,但结果以 "collection+json"
样式序列化。
到目前为止我发现了什么:
spring 上下文中有 3 个 ObjectMapper
实例:
objectMapper
_halObjectMapper
halObjectMapper
我用所有这三个转换了响应,发现前两个产生 "collection+json"
输出("links"
和 "rel"
),第三个产生预期的 HAL 样式( "_links"
没有 "rel"
).
为什么有三个?我如何检查和控制这些 objectMappers 中的哪一个用于呈现响应?我的其他端点怎么可能 return 预期格式?
这是我的简化代码,如果您对它感兴趣的话:
@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"
}
}
}
好吧,经过又一天的挖掘 google 搜索结果、sprint-boot 代码和大量的反复试验,我终于找到了答案,这当然是微不足道的:
Spring 将选择 MessageConverter
用于将响应对象转换为适当的格式,方法是将已注册的转换器与对象的类型相匹配(在我的例子中为 SearchResponse
)和响应类型("application/hal+json"
对我来说)。仅当响应对象的类型为 ResourceSupport
时,才会选择 halJacksonHttpMessageConverter
。所以我所要做的就是让我的 SearchResponse
扩展 ResourceSupport
并且我得到了预期的响应格式。
public class SearchResponse extends ResourceSupport {...}