java - Spring MVC : ResponseBodyAdvice doesn't get called for null response from controller

标签 java spring rest spring-boot spring-mvc

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

我的问题是如何克服这种行为?基本上,对于 Controller 返回 null 的情况(例如不存在数据时),我仍然希望我的 API 输出包含公共(public)字段。

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

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

但是,由于我的 ResponseBodyAdvice 未执行,因此我仅得到带有其他 header 的 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;
}

}

最佳答案

您需要从 Controller 返回如下内容,以便在 NULL 响应的情况下执行 ResponseBodyAdvice。

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

然后,一旦您的 ResponseBodyAdvice 被执行,您就可以重组您的响应。

基本上,您的 Controller 不应该只返回 NULL,但具有 NULL 数据的 ResponseEntity 将强制您的情况执行所需的行为。

关于java - Spring MVC : ResponseBodyAdvice doesn't get called for null response from controller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54055490/

相关文章:

spring - transient 对象异常 : object references an unsaved transient instance - save the transient instance before flushing

java - Spring MVC @RequestParam 和 @SessionAttribute

web-services - 我的网络服务是 RESTFUL 的吗?

java - Eclipse JUnit - 在 Eclipse 窗口中看到 "initializationError"的可能原因

java - 如何在特定位置开始读取文件?

java - C++ 和 Java 中的套接字

javascript - 重新排列不起作用

java - 获取 Java 应用程序中的所有异常

spring - Criteria查询规范中不同类型的合并规范

java - 找不到 Java 类型、类 java.util.ArrayList 和 MIME 媒体类型、application/xml 的消息正文编写器