spring 28 @ControllerAdvice 之 ResponseBodyAdvice
ResponseBodyAdvice 增强
ResponseBodyAdvice 增强 在整个 HandlerAdapter 调用过程中所处的位置
点击查看代码
@Configuration
public class WebConfig {
@ControllerAdvice //将所有返回值类型统一成自定义的结果类型 如 Resout 含有 code(状态码) msg(信息) data(原数据)
static class MyControllerAdvice implements ResponseBodyAdvice<Object> {
// 满足条件才转换
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
//判断当前方法上是否有注解
if (returnType.getMethodAnnotation(ResponseBody.class) != null ||
//AnnotationUtils spring 提供的工具 判断当前类上是否有注解或者组合注解
AnnotationUtils.findAnnotation(returnType.getContainingClass(), ResponseBody.class) != null) {
// returnType.getContainingClass().isAnnotationPresent(ResponseBody.class)) {
return true;
}
return false;
}
// 将 User 或其它类型统一为 Result 类型
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
if (body instanceof Result) {
return body;
}
return Result.ok(body);
}
}
小结
- ResponseBodyAdvice 返回响应体前包装
- 在配置类中加了 @ControllerAdvice 并实现 ResponseBodyAdvice 接口 将所有返回值统一,如 常见的 Resout ,避免新手直接返回了数据,没用 Resout 包装。