从零开始的SpringMVC生活(八)

表现层数据封装(通信协议)

格式:

{

        "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);
    }

测试运行,正常

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值