更改包装中响应正文的类型

时间:2019-12-10 11:06:45

标签: spring spring-restcontroller spring-hateoas

我的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的时间点,所有用于序列化的设置都已经设置好了。有没有办法提前一步?

0 个答案:

没有答案