先说说Controller规范,主要的内容是就是接口定义里面的内容,你只要遵循里面的规范,controller就问题不大,除了这些,还有另外的几点:

1 所有函数返回统一的ResultBean/PageResultBean格式

原因见我的接口定义这个贴。没有统一格式,AOP无法玩。

2 ResultBean/PageResultBean是controller专用的,不允许往后传!

3 Controller做参数格式的转换,不允许把json,map这类对象传到services去,也不允许services返回json、map。

一般情况下!写过代码都知道,map,json这种格式灵活,但是可读性差,如果放业务数据,每次阅读起来都比较困难。定义一个bean看着工作量多了,但代码清晰多了。

4 参数中一般情况不允许出现Request,Response这些对象

主要是可读性问题。一般情况下。

5 不需要打印日志

日志在AOP里面会打印,而且我的建议是大部分日志在Services这层打印。

规范里面大部分是 不要做的项多,要做的比较少,落地比较容易。

ResultBean定义带泛型,使用了lombok。

@Data
public class ResultBean<T> implements Serializable {private static final long serialVersionUID = 1L;public static final int NO_LOGIN = -1;public static final int SUCCESS = 0;public static final int FAIL = 1;public static final int NO_PERMISSION = 2;private String msg = "success";private int code = SUCCESS;private T data;public ResultBean() {super();}public ResultBean(T data) {super();this.data = data;}public ResultBean(Throwable e) {super();this.msg = e.toString();this.code = FAIL;}
}

AOP代码,主要就是打印日志和捕获异常,异常要区分已知异常和未知异常,其中未知的异常是我们重点关注的,可以做一些邮件通知啥的,已知异常可以再细分一下,可以不同的异常返回不同的返回码:

/**
 * 处理和包装异常
 */
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;}
}

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>

现在知道为什么要返回统一的一个ResultBean了:

  • 为了统一格式
  • 为了应用AOP
  • 为了包装异常信息

分页的PageResultBean大同小异,大家自己依葫芦画瓢自己完成就好了。

Controller规范,摘自晓风轻专栏相关推荐

  1. Java约定俗成怎么定义_Java接口定义规范,摘自晓风轻专栏

    1. 返回格式不统一 同一个接口,有时候返回数组,有时候返回单个:成功的时候返回对象,失败的时候返回错误信息字符串.工作中有个系统集成就是这样定义的接口,真是辣眼睛.这个对应代码上,返回的类型是map ...

  2. 日志规范——转自晓风轻专栏

    看晓风轻大大的程序员你为什么这么累专栏,发现对日志规范提出的要求如下 1 能找到那个机器 2 能找到用户做了什么 针对第一点,我修改了一下nginx的配置文件,让返回头里面返回是那个机器处理的. ng ...

  3. 读书笔记之《程序员你为什么这么累-晓风轻编码规范》

    <程序员你为什么这么累-晓风轻编码规范> 讲述关于编码规范的示例,怎么样定义接口和代码模板,怎么样把业务代码写简单清晰. 使用场景:日常项目开发中可以时长查看,符合条件可以应用到. 一.目 ...

  4. Controller规范和接口定义,添加一条新数据并返回此数据的ID(主键)

    参考文章: 烂代码之:Controller规范和接口定义 添加一条新数据并返回此数据的ID(主键) 删除数据返回boolean 添加数据后返回Id <insert id="" ...

  5. 我的编码习惯 —— Controller规范

    今天来说说大家关注的AOP如何实现. 先说说Controller规范,主要的内容是就是接口定义里面的内容,你只要遵循里面的规范,controller就问题不大,除了这些,还有另外的几点: 1. 所有函 ...

  6. ThinkPHP开发规范 --- 摘自ThinkPHP手册

    开发规范 命名规范 使用ThinkPHP开发的过程中应该尽量遵循下列命名规范: 类文件都是以.class.php为后缀(这里是指的ThinkPHP内部使用的类库文件,不代表外部加载的类库文件),使用驼 ...

  7. Effective C++读书笔记 摘自 pandawuwyj的专栏

    Effective C++读书笔记(0)       Start   声明式(Declaration):告诉编译器某个东西的名称和类型,但略去细节.   std::size_t numDigits(i ...

  8. Spring MVC学习总结(17)——SpringMVC之接口规范与Controller规范

    一.关于SpringMVC接口定义要注意以下常见的几种问题 1. 返回格式不统一 同一个接口,有时候返回数组,有时候返回单个:成功的时候返回对象,失败的时候返回错误信息字符串.工作中有个系统集成就是这 ...

  9. 精美网页设计案例_用户体验设计的精美艺术

    精美网页设计案例 There are interactive experiences that simply blow you away. You know it's been a positive ...

最新文章

  1. HDU3007(最小圆覆盖问题)
  2. mysql seq 重置_需要在Oracle中重置序列的值
  3. ASP.NET MVC: 使用自定义 ModelBinder 过滤敏感信息
  4. boost::math::policies用法的测试程序
  5. Exchannge 2013数据库副本频繁自动切换
  6. MySQLdb._exceptions.ProgrammingError: (1064, <NULL>)
  7. 如何 Scale Up/Down 应用?- 每天5分钟玩转 Docker 容器技术(126)
  8. 6425C-Lab8 使用组策略管理安全性(2)
  9. cvMorphologyEx() 多种图像形态学
  10. Java系统日志管理
  11. 淘宝新开店铺没有营业执照怎么办
  12. excel公式编辑器_EXCEL从文件夹中提取符合条件的记录,其实很简单
  13. 记录学习Android基础的心得07:硬件控制P1
  14. SAP ABAP BDC基础使用方法
  15. html5游戏ztype源码,Ztype打字游戏!
  16. html下拉加载原理,GitHub - gavinjzx/wxPull: 原生JS实现微信公众号或网页使用下拉加载和上拉刷新...
  17. 显示杂谈(1)-Gamma到底是个什么鬼
  18. JavaScript学习(五)
  19. KONICA MINOLTA 423SeriesPS-8打印机驱动
  20. 任务定义的脑网络的内在连接模式可以个体化预测精神分裂症患者的认知症状维度

热门文章

  1. Celery启动定时任务遇到报错
  2. 组合问题,用1元纸币兑换1分,2分和5分硬币,要求兑换总数为50枚,问组合方式多少种?
  3. 期末作业成品代码——绿色的餐饮美食网站(1页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码
  4. OpenGL编程轻松入门之使用颜色
  5. 京东回应淘汰员工,这是要过冬节奏?
  6. 利用腾讯云函数服务进行每日wps签到打卡(部分失效)
  7. Java:利用接口实现打印机案例(墨盒有彩色和黑白色,纸张有A4纸和B5纸)
  8. CTF之懵懂时期系列---后台登录
  9. 我是如何拿到腾讯offer的(干货面经+经验分享)
  10. C语言简单的键盘玩扫雷小游戏(完结)