赞
踩
问题代码一:(返回值不统一,混乱)
$.ajax({
type: "GET",
url: "/goods/add",
dataType: "json",
success: function(data) {
if (data.flag) {
alert("添加成功");
} else {
alert(data.message);
}
},
error: function(data){
alert("添加失败");
}
});
问题代码二:
@RequestMapping("/goods/add")
@ResponseBody
public Map add(Goods goods) {
Map map = new HashMap();
try {
// do something
map.put(flag, true);
} catch (Exception e) {
e.printStackTrace();
map.put("flag", false);
map.put("message", e.getMessage());
}
reutrn map;
}
这种方式捕获异常后, 返回了错误信息, 且前台做了一定的处理, 看起来很完善? 但用 HashMap 中的 flag 和 message 这种字符串来当键很容易处理, 例如你这里叫 message, 别人起名叫 msg, 甚至有时手抖打错了, 怎么办? 前台再改成 msg 或其他的字符?, 前端后端这样一直来回改?
更有甚者在情况 A 的情况下, 返回 json, 在情况 B 的情况下, 重定向到某个页面, 这就更乱了. 对于这种不统一的结构处理起来非常麻烦.
1、新人上手文档手册和文档
2、建立岗前培训以及上岗前的考核机制
3、岗前培训,标准示例代码的学习。工具的学习、配置,最佳实践等。
4、岗前,完成根据题库设定的试题、实战型项目的考核。到此完成验收。
1、工具检查,静态代码扫描工具:sonarqube或者阿里的规约插件等
2、线上使用gitlib加gitflow,进行在线review
3、线下定期举行,meeting式、三俩结组式的codeReview
要让定期review和岗前培训得到长期的支持和落实。
需要高层领导在激励机制上,做出一定的设计和支持。
主动发现并帮助团队成员,共同进步和成长。定期组织主题技术的分享。
这层,主要是项目leader和项目经理的考核范围,应纳入其绩效考核。
1、统一在AOP中进行处理(使用@ControllerAdvice,@ExceptionHandler)
package com.dynamic.springbootbvexcetionhandler.exception; import com.dynamic.springbootbvexcetionhandler.util.ResultBean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.validation.BindException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; /** * a global execption handler use aop * * @author Administrator * @date 2019/1/6 * commpany: yonyou * version:v1.0.0 */ @ControllerAdvice @ResponseBody public class WebExceptionHandler { private static final Logger LOGGER = LoggerFactory.getLogger(WebExceptionHandler.class); @ExceptionHandler public ResultBean methodArgumentNotValid(BindException e) { LOGGER.error("参数校验失败",e); StringBuilder errorMessage = new StringBuilder(); e.getAllErrors().forEach(objectError -> errorMessage.append(objectError.getDefaultMessage()).append(",") ); return ResultBean.error(1, errorMessage.toString()); } @ExceptionHandler public ResultBean methodArgumentNotValidForJsonArgumentResolver(MethodArgumentNotValidException e) { LOGGER.error("json参数绑定到对象失败",e); StringBuilder errorMessage = new StringBuilder(); e.getBindingResult().getAllErrors().forEach( errors-> errorMessage.append(errors.getDefaultMessage()).append(",") ); return ResultBean.error(1, errorMessage.toString()); } @ExceptionHandler public ResultBean unKnowException(Exception e) { LOGGER.error("未知异常", e); //发送邮件,或者短信通知 return ResultBean.error(-999, "发生了未知异常,请联系系统管理员"); } @ExceptionHandler public ResultBean ageDeleteException(AgeDeleteException e) { LOGGER.error("不能删除18岁以下的用户",e); return ResultBean.error(-1, "不能删除18岁以下的用户"); } }
2、定义统一的返回对象
private int code; private String message; private Collection<T> data; private ResultBean() { } private ResultBean(int code, String message) { this.code = code; this.message = message; } private ResultBean(int code, String message, Collection<T> data) { this.code = code; this.message = message; this.data = data; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Collection<T> getData() { return data; } public void setData(Collection<T> data) { this.data = data; } public static ResultBean error(int code, String message) { ResultBean resultBean = new ResultBean(code, message); return resultBean; } public static ResultBean success() { ResultBean resultBean = new ResultBean(); resultBean.setCode(0); resultBean.setMessage("success"); return resultBean; } public static <V> ResultBean<V> success(Collection<V> data) { ResultBean resultBean = new ResultBean(); resultBean.setMessage("success"); resultBean.setData(data); resultBean.setCode(0); return resultBean; } @Override public String toString() { final StringBuilder sb = new StringBuilder("com.dynamic.springbootbvexcetionhandler.util.ResultBean{"); sb.append("code=").append(code); sb.append(", message='").append(message).append('\''); sb.append(", data=").append(data); sb.append('}'); return sb.toString(); }
源码下载:https://github.com/bill4j/spring-boot-course/tree/develop/spring-boot-exceptionHandler
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。