对返回数据格式的统一
首先规定一下错误的输出格式:
{ "code": 1, "msg": "提示", "data": null }• 1 • 2 • 3 • 4 • 5
data是一个对象
首先定义一个http请求返回的类
package cn.chenhaoxiang.common.entity; /** * Created with IntelliJ IDEA. * User: 陈浩翔. * Date: 2018/1/7. * Time: 下午 2:17. * Explain: http请求返回的最外层对象 */ public class Result<T> { /** * 错误码 */ private Integer code; /** * 提示信息 */ private String msg; /** * 返回的具体内容 */ private T data; public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public T getData() { return data; } public void setData(T data) { this.data = data; } }
然后可以定义一个工具类:
package cn.chenhaoxiang.utils; import cn.chenhaoxiang.common.entity.Result; /** * Created with IntelliJ IDEA. * User: 陈浩翔. * Date: 2018/1/7. * Time: 下午 2:45. * Explain: */ public class ResultUtil { public static Result success(Object object){ Result result = new Result(); result.setCode(1); result.setMsg("成功"); result.setData(object); return result; } public static Result successNoData(){ return success(null); } public static Result error(Integer code,String msg){ Result result = new Result(); result.setCode(code); result.setMsg(msg); return result; } }
这个ResultUtil中的方法,其实写在BaseController中也挺不错的
People实体类中:
@NotBlank(message = "名字不能为空")//String 不是 null 且去除两端空白字符后的长度(trimmed length)大于 0 private String name; @NotNull(message = "分数必传")//CharSequence, Collection, Map 和 Array 对象不能是 null, 但可以是空集(size = 0) private Double score; private String address; @Min(value = 18,message = "年龄必须大于18")//message为提示 20180103 private Integer age;
属性上的注解,都是限制条件,注释上有说明
在Controller中使用的时候:
/** * 新增一个对象 * 增加一个功能,如果年龄大于18,就不让添加进数据库 20180103 * @param people * @return */ @PostMapping(value = "/add") public Result<People> peopleAdd(@Valid People people, BindingResult bindingResult){//@Valid 注解表示使用数据校验 People类中对年龄进行了限制 ,验证返回结果会在bindingResult对象中 20180103 //@RequestParam(value = "people") 直接传类的时候,建议不要使用RequestParam注解 //当然,你可以选择每一个参数都写上,但没必要,更多的时候是直接传类对象,注意url的参数名和类中属性名对上 if(bindingResult.hasErrors()){//验证出现错误 return ResultUtil.error(0,bindingResult.getFieldError().getDefaultMessage()); } return ResultUtil.success( peopleDao.save(people)); }
访问,看结果:
失败的只演示这个,再演示一个添加成功的
这样完成了对返回数据格式的统一
对不同结果统一返回处理
获取分数判断
如果分数小于60,返回”不及格”
分数大于60且小于80,返回”良好”
下面来看代码吧
在Service层的实现类中
/** * 往往业务有点复杂,不能直接返回String,比如在这里 * @param id */ @Override public void getScore(Integer id) throws Exception { People people = peopleDao.findOne(id); Double score = people.getScore(); if(score<60){ //返回 "不及格" throw new PeopleException(ResultEnum.FLUNK); }else if(score>=60 && score<80 ){ //返回 "良好" throw new PeopleException(ResultEnum.WELL); } //前面的只是作为校验,也就是条件,条件满足后才有后面的操作 //如果分数大于80,则给他进行另外的操作,这个时候就不好返回字符串了 //有的可能用数字来标志,返回1,2,3等等,然后在Controller再判断,这样是可以达到效果,但是代码写起来很别扭,在service中判断一次,controller还需要再判断一次 // 而且返回1,2,3都是自己标记的,假如这个标志多了呢,是不是很麻烦 //这个时候,统一异常处理就派上用处了 }
自定义枚举ResultEnum
package cn.chenhaoxiang.enums; /** * Created with IntelliJ IDEA. * User: 陈浩翔. * Date: 2018/1/7. * Time: 下午 3:31. * Explain: */ public enum ResultEnum { UNKONW_ERROR(-1,"未知错误"), ERROR(0,"失败"), SUCCESS(1,"成功"), FLUNK(100,"不及格"), WELL(101,"良好") ; ResultEnum(Integer code, String msg) { this.code = code; this.msg = msg; } private Integer code; private String msg; public Integer getCode() { return code; } public String getMsg() { return msg; } }
自定义异常类PeopleException
package cn.chenhaoxiang.exception; import cn.chenhaoxiang.enums.ResultEnum; /** * Created with IntelliJ IDEA. * User: 陈浩翔. * Date: 2018/1/7. * Time: 下午 3:18. * Explain: */ public class PeopleException extends RuntimeException {//不要继承Exception ,Spring只对你的异常是RuntimeException的才会进行事务回滚 private Integer code; public PeopleException(ResultEnum resultEnum) { super(resultEnum.getMsg()); this.code = resultEnum.getCode(); } public PeopleException(Integer code,String message) { super(message);//父类本身就有message this.code = code; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } }
异常捕获 统一异常返回格式
package cn.chenhaoxiang.handle; import cn.chenhaoxiang.common.entity.Result; import cn.chenhaoxiang.enums.ResultEnum; import cn.chenhaoxiang.exception.PeopleException; import cn.chenhaoxiang.utils.ResultUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; /** * Created with IntelliJ IDEA. * User: 陈浩翔. * Date: 2018/1/7. * Time: 下午 3:13. * Explain:异常捕获 统一异常返回格式 */ @ControllerAdvice public class ExceptionHandle { private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class); @ExceptionHandler(value = Exception.class)//声明需要捕获的异常类 - 写成PeopleException,就是只会捕获PeopleException异常了 @ResponseBody //由于返回浏览器那边是json格式,就需要这个 public Result handle(Exception e){ if(e instanceof PeopleException){ PeopleException peopleException = (PeopleException) e; return ResultUtil.error(peopleException.getCode(),peopleException.getMessage()); }else { logger.error("[系统异常]-{}",e); return ResultUtil.error(ResultEnum.UNKONW_ERROR); } } }
固定返回格式,避免逻辑在一个地方处理,另一个地方重复处理,我们用异常来处理
将code和message固定成枚举,来统一管理