本文转载自晓风轻博客:https://xwjie.github.io/
ResultBean定义
定义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实现
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>
简单示例
贴一个简单的controller。请对比 程序员你为什么这么累?里面原来的代码查看,没有对比就没有伤害。
/**
* 配置对象处理器
*
* @author 晓风轻 https://github.com/xwjie/PLMCodeTemplate
*/
@RequestMapping("/config")
@RestController
public class ConfigController {
private final ConfigService configService;
public ConfigController(ConfigService configService) {
this.configService = configService;
}
@GetMapping("/all")
public ResultBean<Collection<Config>> getAll() {
return new ResultBean<Collection<Config>>(configService.getAll());
}
/**
* 新增数据, 返回新对象的id
*
* @param config
* @return
*/
@PostMapping("/add")
public ResultBean<Long> add(Config config) {
return new ResultBean<Long>(configService.add(config));
}
/**
* 根据id删除对象
*
* @param id
* @return
*/
@PostMapping("/delete")
public ResultBean<Boolean> delete(long id) {
return new ResultBean<Boolean>(configService.delete(id));
}
@PostMapping("/update")
public ResultBean<Boolean> update(Config config) {
configService.update(config);
return new ResultBean<Boolean>(true);
}
}