目录
1.3 ResultBean是Controller专用的,是不允许往后传
1.4 Controller做参数格式化的转换,不允许把json,map这类对象传到service去,也不允许services返回json,map
1. Controller层的编码规范
1.1 包括在上一篇博文(接口编码规范)提到的规范内容
1.2 所有函数返回统一的ResultBean格式
1.3 ResultBean是Controller专用的,是不允许往后传
1.4 Controller做参数格式化的转换,不允许把json,map这类对象传到service去,也不允许services返回json,map
一般情况下写过代码的都知道: map,json这种格式灵活,但是可读性极差。在业务层,存放数据的应该是bean,而不应该是map或者是json等数据格式。对于json一般用于前后端数据的传输。
切记一点: 业务层处理业务逻辑一定要清晰明了。所以,使用Bean代码能够更加清晰的表示数据。
1.5 不需要打印日志
日志不要在Controller中打印,要在AOP里面打印日志。建议大部分日志要在Service这层打印。
规范里面大部分是: 不要做的太多,要做的比较少,落地比较容易。
2. AOP实现
下面简单介绍以下AOP的实现
2.1 ControllerAOP代码实现
在AOP中,主要的工作任务是打印日志和捕获异常。接下来简单写一下ControllerAOP的代码(仅供参考)
/**
* 处理和包装异常
*/
public class ControllerAOP {
private static final Logger logger = LoggerFactory.getLogger(ControllerAOP.class);
public Object handlerControllerMethod(ProceedingJoinPoint pjp) {
long startTime = System.currentTimeMillis();
ResultBean<?> result;
try {
result = (ResultBean<?>) pjp.proceed();
logger.info(pjp.getSignature() + "use time:" + (System.currentTimeMillis() - startTime));
} catch (Throwable e) {
result = handlerException(pjp, e);
}
return result;
}
private ResultBean<?> handlerException(ProceedingJoinPoint pjp, Throwable e) {
ResultBean<?> result = new ResultBean();
// 已知异常
if (e instanceof CheckException) {
result.setMsg(e.getLocalizedMessage());
result.setCode(ResultBean.FAIL);
} else if (e instanceof UnloginException) {
result.setMsg("Unlogin");
result.setCode(ResultBean.NO_LOGIN);
} else {
logger.error(pjp.getSignature() + " error ", e);
//TODO 未知的异常,应该格外注意,可以发送邮件通知等
result.setMsg(e.toString());
result.setCode(ResultBean.FAIL);
}
return result;
}
}2.2 AOP配置
关于使用java代码还是xml配置,推荐使用xml配置,因为这个会不定期的改动
<!-- aop -->
<aop:aspectj-autoproxy />
<beans:bean id="controllerAop" class="xxx.common.aop.ControllerAOP" />
<aop:config>
<aop:aspect id="myAop" ref="controllerAop">
<aop:pointcut id="target"
expression="execution(public xxx.common.beans.ResultBean *(..))" />
<aop:around method="handlerControllerMethod" pointcut-ref="target" />
</aop:aspect>
</aop:config>2.3 controller测试代码

现在知道为什么要返回统一的一个ResultBean了:
- 为了统一的格式
- 为了应用AOP
- 为了包装异常信息
通过这两篇博文(接口和controller)的介绍,可以总结出: 先有统一的接口定义规范,然后又AOP实现。先有思想再有技术(这也是符合Spring框架中的AOP的思想)。
版权声明:本文为xzp_12345原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。