我有一个Spring boot REST API应用程序。我有一个用例,可以向所有API响应(例如time
和clientId
)添加一些通用参数。为此,我使用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;
}
}
最佳答案
您需要从控制器返回以下信息,以便在NULL响应的情况下执行ResponseBodyAdvice。
new ResponseEntity<>(null, HttpStatus.OK);
然后,一旦您的ResponseBodyAdvice被执行,您就可以重组您的响应。
基本上,您的控制器不仅应该返回NULL,而且带有NULL数据的ResponseEntity会强制您的案例采取必要的行为。