我的RestController中有一个@GetMapping
,其内容如下:
@GetMapping("/")
ResponseEntity<MyResponse> getMyResponse()
{
...
return ResponseEntity.ok(myResponse);
}
我想在进入网络的途中拦截它,将ResponseType更改为ResponseEntity<EntityModel<MyResponse>>
并添加一些HATEOAS链接。
我找到了这个答案:
How to wrap JSON response from Spring REST repository?
他们在使用ResponseBodyAdvice
的地方,它允许您以某种方式更改响应。
@Override // declared in ResponseBodyAdvice<Object>
public Object beforeBodyWrite(Object body,
MethodParameter returnType,
MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType,
ServerHttpRequest request,
ServerHttpResponse response)
{
EntityModel model = new EntityModel(body);
model.add(new Link(".../some/url", "related");
return model;
}
但是无法产生所需的输出。我确实具有属性"_links": { "related": [{ "href": ".../some/url" }]}
。而不是生成JSON属性"links": [{ "rel": "related", "href": ".../some/url" }]
。
起作用的是,如果我将ResponseBodyAdvice
更改为{p>,则在@GetMapping
中添加链接
@GetMapping("/")
ResponseEntity getMyResponse()
{
...
return ResponseEntity.ok(new EntityModel(myResponse));
}
基本上,当我不更改ResponseBodyAdvice
中的响应类型时。
我想原因是,在调用方法beforeBodyWrite
的时间点,所有用于序列化的设置都已经设置好了。有没有办法提前一步?