作用:对本次请求的controller的原返回值进行处理,然后返回自定义的返回值
注:Spring中是先根据元返回值查询HttpMessageConverter,然后再走ResponseBodyAdvice,所以我们修改了元返回值之后,还要考虑之前的这个MessageConverter是否支持新的自定义返回值,所以此时应该将通用转换器jackson的那个放到转换器最前面
下面是代码示例,首先创建一个返回值类
public class MyResult {
private int status;
}
1.创建一个类A,implements ResponseBodyAdvice接口
2.在类A上加注解@ControllerAdvice,不能是@Component等其他注入注解
@ControllerAdvice
public class ValidException implements ResponseBodyAdvice{
@Override
public boolean supports(MethodParameter returnType, Class converterType) {
return true;
}
// 参数body就是controller原返回值
// 返回值Object是本次请求实际返回去的值
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
if(body.getClass()!= MyResult.class){
return new MyResult();
}
return body;
}
}
之前也说了,如果原返回值是stirng,则spring会选择StringMessageConvert,所以我们选择万能的jackson转换器,需要修改默认转换区顺序
@Component
public class MessageConvert implements WebMvcConfigurer {
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
// 我使用的版本最后一个转换器是jackson,所以我直接把最后一个拿到最前面
HttpMessageConverter<?> con = converters.get(converters.size() - 1);
converters.add(0, con);
System.out.println(converters);
}
}