- SpringMVC 4.1支持ResponseBodyAdvice接口【网上看到说的】
- 通过@ControllerAdvice注解 + ResponseBodyAdvice接口实现
实现步骤
- 先定义统一返回类JsonReturn
@Data
public class JsonReturn {
private int code;
private String msg = "";
private Object result = null;
}
- 自定义类,实现ResponseBodyAdvice接口中的方法。在方法中,完成逻辑处理
- 给自定义类,加上 @ControllerAdvice 完成所有Controller类增强功能【@ControllerAdvice注解:SpringMVC 中 @ControllerAdvice 注解的三种使用场景! 】
/**
* 通过 @ControllerAdvice + 实现 ResponseBodyAdvice 接口。
* 完成 统一返回结果处理
*/
@ControllerAdvice
public class ReturnJsonResponseBodyAdvice implements ResponseBodyAdvice<Object> {
/**
* 是否支持 该 返回体 通知器
* true:表示支持
*/
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
/**
* 如果走的是 FastJsonHttpMessageConverter 消息转换器,
* 则MyResponseBody 通知器,来完成完成统一JSON格式返回
*/
Class<FastJsonHttpMessageConverter> aClass = FastJsonHttpMessageConverter.class;
// 获取 Controller中方法上的 @ResponseBody注解
ResponseBody isMethodResponseBody = returnType.getMethodAnnotation(ResponseBody.class);
Class<?> cClass = returnType.getContainingClass();
// 判断Controller类中是否包含 @RestController 注解
boolean isRestController = cClass.isAnnotationPresent(RestController.class);
// 判断Controller类中是否包含 @ResponseBody注解
boolean isResponseBody = cClass.isAnnotationPresent(ResponseBody.class);
/**
* 如果:1、走的是FastJsonHttpMessageConverter消息转换器
* 或 Controller类上有@ResponseBody注解
* 或 Controller类上有 @RestController注解
* 或 Controller中的方法上有 @ResponseBody注解
* 则:该 ResponseBody通知器主持
*/
if (converterType == aClass || isResponseBody || isRestController || null != isMethodResponseBody) {
System.out.println("走的是 FastJsonHttpMessageConverter 转换器");
return true;
}
return false;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
/**
* 将需要返回的实际结果,
* 设置到统一返回格式对象的result属性中
*/
if (body instanceof JsonReturn) {
return body;
} else {
JsonReturn jsonReturn = new JsonReturn();
jsonReturn.setResult(body);
return jsonReturn;
}
}
}
- 以上方案,在 spring-webmvc 5.2.18.RELEASE上测试通过
网友评论