Spring MVC:不会为控制器的空响应调用ResponseBodyAdvice

时间:2019-01-05 19:29:55

标签: java spring rest spring-boot spring-mvc

我有一个Spring Boot REST API应用程序。我有一个用例,可以向所有API响应中添加一些通用参数,例如timeclientId。为此,我使用ResponseBodyAdvice来操纵控制器的输出。但是,如果控制器返回null,则不会调用ResponseBodyAdvice。我已经通过添加日志和断点来验证了这一点。

我的问题是我该如何克服这种行为?基本上,对于控制器返回null的情况(例如没有数据的情况),我仍然希望我的API输出包含公共字段。

当没有给定ID的用户时,这是我对API GET /users/{userId}的预期输出。

{
   "time": "2018-11-10 23:00:00",
   "clientId": "MyClient",
   "data": null
}

但是,由于我的ResponseBodyAdvice没有执行,所以仅200和其他标头都没有输出。

这是我的ResponseBodyAdvice的代码

@ControllerAdvice("com.tl.core.controller")
public class TLResponseAdvice implements ResponseBodyAdvice<Object> {

@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
    System.out.println("::RBA:: supports");
    return true;
}

@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
        Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
        ServerHttpResponse response) {
    System.out.println("::RBA:: beforebodywrite1 " + body);
    if(returnType.getMethod().getName().equalsIgnoreCase("handleControllerException")) {
        return body;
    }
    System.out.println("::RBA:: beforebodywrite2");
    final RestResponse<Object> output = new RestResponse<>(HttpStatus.OK.value());
    output.setData(body);
    // set common fields here.
    ...
    return output;
}

@ExceptionHandler(Exception.class)
@ResponseBody
public TLResponseEntity<Object> handleControllerException(HttpServletRequest request, Throwable ex) {
    final RestResponse<Object> output = new RestResponse<>(HttpStatus.INTERNAL_SERVER_ERROR.value());
    // set common fields here
    ...
    final TLResponseEntity<Object> finaloutput = new TLResponseEntity<>(output);
    return finaloutput;
}

}

1 个答案:

答案 0 :(得分:0)

您需要从控制器返回以下信息,以便在响应为NULL的情况下执行ResponseBodyAdvice。

new ResponseEntity<>(null, HttpStatus.OK);

然后,在您的ResponseBodyAdvice执行后,您可以重新构建响应。

基本上,您的控制器不应仅返回NULL,而是具有NULL数据的ResponseEntity会强制您的案例采取必要的行为。