关于R类的统一返回的拦截处理
分析
在实际开发中,如果你团队的人员结构不是特别多的时候,比如:1-11人等。这个其实还是很好管理。你说句话还有威信。但是随着你的公司的组织结构越来越多,你接下的架构任何变化和调整可能都会面临阻碍。这个时候你去谈威信,不好意思没几个人能够被你说服。
解决方案
看到这里,应该很多同学都应该觉得这样的封装还不错,甚至会觉得很完美。
但是其实这个是很大的问题和弊端,因为你每写一个接口或者方法,都需要进行R返回,还是蛮累的。
如果你写这种代码在公司里推广给整个公司的人去使用,估计会被吐槽。原因开发太过于强制和依赖R类。并不是什么好事,怎么优化和处理呢?
可以使用spring提供的结果拦截增强处理机制来解决这个问题,如下:
采用springboot提供的ResponseBodyAdvice
l处理即可。
ResponseBodyAdvice的作用是:拦截Controller方法的返回值,统一处理返回值到响应体中,一般来做response的统一格式,加密,签名等。如下:
在使用的时候在controller的包上增加basePackages=”com.kuangstudy”,因为如果不加的话,可能给整个系统的产生冲突影响比如:如果你使用了swagger时会出现空白异常。
@ControllerAdvice(basePackages = "com.kuangstudy")
public class ResultResponseHandler implements ResponseBodyAdvice<Object> {
/**
* 是否支持advice功能,true是支持 false是不支持
*
* @param methodParameter
* @param aClass
* @return
*/
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
return true;
}
// 参数o 代表其实就是springmvc的请求的方法的结果
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
// 对请求的结果在这里统一返回和处理
return R.success(o);
}
}
结果
{
"code": 200,
"data": {
"id": 1,
"nickname": "yykk",
"password": ".***",
"avatar": null,
"address": "梅州"
},
"message": "成功!"
}
ResponseBodyAdvice
它是利用spring中的AOP机制来完成的一种,对springmvc请求过程中对请求方法的结果进行增强的一种通知。它会对你的结果进行加密,加工等处理,把加工的数据返回给浏览器。