根据我们不同的处理方法,返回的数据格式都会不同,例如添加只返回true|false,删除同理,而查询却返回数据。
为此我们封装一个result类来用于表现层的返回。
- public class Result {
- //描述统一格式中的数据
- private Object data;
- //描述统一格式中的编码,用于区分操作,可以简化配置0或1表示成功失败
- private Integer code;
- //描述统一格式中的消息,可选属性
- private String msg;
-
- public Result() {
- }
-
- public Result(Integer code,Object data) {
- this.data = data;
- this.code = code;
- }
-
- public Result(Integer code, Object data, String msg) {
- this.data = data;
- this.code = code;
- this.msg = msg;
- }
-
- public Object getData() {
- return data;
- }
-
- public void setData(Object data) {
- this.data = 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;
- }
- }
Code类不是固定的,是商量好的一种编号,每种编号对应业务操作的不同状态。
- public class Code {
- //Code类的常量设计也不是固定的,可以根据需要自行增减。
- public static final Integer SAVE_OK = 20011;
- public static final Integer DELETE_OK = 20021;
- public static final Integer UPDATE_OK = 20031;
- public static final Integer GET_OK = 20041;
-
- public static final Integer SAVE_ERR = 20010;
- public static final Integer DELETE_ERR = 20020;
- public static final Integer UPDATE_ERR = 20030;
- public static final Integer GET_ERR = 20040;
- }
- //统一每一个控制器方法返回值
- @RestController
- @RequestMapping("/books")
- public class BookController {
-
- @Autowired
- private BookService bookService;
-
- @PostMapping
- public Result save(@RequestBody Book book) {
- boolean flag = bookService.save(book);
- return new Result(flag ? Code.SAVE_OK:Code.SAVE_ERR,flag);
- }
-
- @PutMapping
- public Result update(@RequestBody Book book) {
- boolean flag = bookService.update(book);
- return new Result(flag ? Code.UPDATE_OK:Code.UPDATE_ERR,flag);
- }
-
- @DeleteMapping("/{id}")
- public Result delete(@PathVariable Integer id) {
- boolean flag = bookService.delete(id);
- return new Result(flag ? Code.DELETE_OK:Code.DELETE_ERR,flag);
- }
-
- @GetMapping("/{id}")
- public Result getById(@PathVariable Integer id) {
- Book book = bookService.getById(id);
- Integer code = book != null ? Code.GET_OK : Code.GET_ERR;
- String msg = book != null ? "" : "数据查询失败,请重试!";
- return new Result(code,book,msg);
- }
-
- @GetMapping
- public Result getAll() {
- List
bookList = bookService.getAll(); - Integer code = bookList != null ? Code.GET_OK : Code.GET_ERR;
- String msg = bookList != null ? "" : "数据查询失败,请重试!";
- return new Result(code,bookList,msg);
- }
- }

对于Dao层(数据层),Service层(服务层),Controller(业务控制层)等,所抛出的异常应该统一到业务控制层来处理。
@RestControllerAdvice注解可以声明一个类为异常处理器类
@ExceptionHandler注解是定义当前方法用于处理哪一种异常,通过形参可以把异常传进来

自定义异常都要继承RuntimeException这个类,这个类的父类是Exception,这个类是运行异常类,碰到了自动往业务层传递异常。
- //自定义异常处理器,用于封装异常信息,对异常进行分类
- public class BusinessException extends RuntimeException{
- private Integer code;
- public Integer getCode() {
- return code;
- }
- public void setCode(Integer code) {
- this.code = code;
- }
- //自动实现的构造方法有很多,只不过这两种实用
- public BusinessException(Integer code, String message) {
- super(message);
- this.code = code;
- }
- public BusinessException(Integer code, String message, Throwable cause) {
- super(message, cause);
- this.code = code;
- }
- }
- //自定义异常处理器,用于封装异常信息,对异常进行分类
- public class SystemException extends RuntimeException{
- private Integer code;
- public Integer getCode() {
- return code;
- }
- public void setCode(Integer code) {
- this.code = code;
- }
- public SystemException(Integer code, String message) {
- super(message);
- this.code = code;
- }
- public SystemException(Integer code, String message, Throwable cause) {
- super(message, cause);
- this.code = code;
- }
-
- }
- public static final Integer SYSTEM_ERR = 50001;
- public static final Integer SYSTEM_TIMEOUT_ERR = 50002;
- public static final Integer SYSTEM_UNKNOW_ERR = 59999;
-
- public static final Integer BUSINESS_ERR = 60002;
-
拦截并处理异常
- //@RestControllerAdvice用于标识当前类为REST风格对应的异常处理器
- @RestControllerAdvice
- public class ProjectExceptionAdvice {
- //@ExceptionHandler用于设置当前处理器类对应的异常类型
- @ExceptionHandler(SystemException.class)
- public Result doSystemException(SystemException ex){
- //记录日志
- //发送消息给运维
- //发送邮件给开发人员,ex对象发送给开发人员
- return new Result(ex.getCode(),null,ex.getMessage()); //规范返回结果
- }
-
- @ExceptionHandler(BusinessException.class)
- public Result doBusinessException(BusinessException ex){
- return new Result(ex.getCode(),null,ex.getMessage());
- }
-
- //除了自定义的异常处理器,保留对Exception类型的异常处理,用于处理非预期的异常
- @ExceptionHandler(Exception.class)
- public Result doOtherException(Exception ex){
- //记录日志
- //发送消息给运维
- //发送邮件给开发人员,ex对象发送给开发人员
- return new Result(Code.SYSTEM_UNKNOW_ERR,null,"系统繁忙,请稍后再试!");
- }
- }