表现层数据封装(通信协议)
格式:
{
"code":操作码
"data":数据
"msg":特殊消息
}
通信协议需要根据实际使用来修改。
Code
public class 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; }
Result
通信协议的实体类
getter和setter方法
构造方法
BookController
针对返回类型进行修改
@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<Book> book = bookService.getAll(); Integer code = book != null ? Code.GET_OK:Code.GET_ERR; String msg = book != null ? "" : "数据查询失败"; return new Result(code , book , msg); }
测试运行
P.S:
因在BookServiceImpl中返回值都为true所以在删除或修改不存在的值时,仍会得到true。目前没有做出调整。
异常处理器
框架内部抛出异常——因使用不合规导致
数据层抛出异常——因外部服务器故障导致(访问超时)
业务层抛出异常——业务逻辑书写错误导致(遍历业务书写操作,导致索引异常)
表现层抛出异常——数据收集,校验等规则导致(不匹配的数据类型)
工具类抛出异常——工具类书写不严谨不够健壮(必要释放的连接长期未释放)
表现层处理异常,每个方法单独书写会导致代码量巨大且意义不强,如何解决?
AOP思想
异常处理器
@RestControllerAdvice public class ProjectExceptionAdvice { @ExceptionHandler(Exception.class) public Result doException(Exception ex){ System.out.println("有异常"); return new Result(666,null); } }
这个方法会处理Exception类型的异常,并返回结果
多个异常处理可以使用多个方法进行接收处理。
项目异常处理方案
项目异常分类
业务异常(BusinessException)
规范的用户行为产生异常——发送消息传递,提醒规范操作。
不规范的用户行为产生异常——发送消息传递,提醒规范操作。
系统异常(SystemException)
项目运行中可预计无法避免的异常(服务器宕机、停电等)——发送消息安抚用户,提醒运维维护,记录日志。
编程异常(Exception)
编程时未预期到的异常——发送消息安抚用户,提醒编程人员维护,记录日志
创建两个自定义的异常类
BusinessException
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; } }
SystemException
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; } }
Code中添加错误码
public static final Integer SYSTEM_ERR = 50001; public static final Integer SYSTEM_TIMEOUT_ERR = 50002; public static final Integer BUSINESS_ERR = 60002; public static final Integer SYSTEM_UNKNOW_ERR = 59992;
在ProjectExceptionAdvice中添加拦截并处理异常
@RestControllerAdvice public class ProjectExceptionAdvice { @ExceptionHandler(Exception.class) public Result doException(Exception ex){ return new Result(Code.SYSTEM_UNKNOW_ERR,null,"其他错误"); } @ExceptionHandler(SystemException.class) public Result doSystemException(SystemException 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()); } }
调用异常
在getByid方法中进行测试使用
public Book getByid(Integer id) { if(id == 1) { throw new BusinessException(Code.BUSINESS_ERR,"Business异常"); } try{ int i = 1/0; }catch (Exception e){ throw new SystemException(Code.SYSTEM_TIMEOUT_ERR,"System异常",e); } return bookDao.getByid(id); }
测试运行,正常