SpringMVC第五天(SSM整合)

表现层数据封装

设置统一数据返回结果类

java 复制代码
public class Result{
    private Object data;
    private Integer code;
    private String msg;


}

设置统一数据返回结果编码

java 复制代码
package com.cacb.controller;

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

java 复制代码
package com.cacb.controller;

public class Result {
    private Object data;
    private Integer code;
    private String msg;

    public Result(Integer code ,Object data, String msg) {
        this.data = data;
        this.code = code;
        this.msg = msg;
    }

    public Result(Integer code ,Object data) {
        this.data = data;
        this.code = code;
    }

    public Result() {
    }

    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;
    }
}
java 复制代码
package com.cacb.controller;

import com.cacb.domain.Book;
import com.cacb.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

import static com.cacb.controller.Code.*;

@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?SAVE_OK:SAVE_ERR,flag);
    }

    @PutMapping
    public Result update(@RequestBody Book book) {
        boolean flag = bookService.update(book);
        return new Result(flag?UPDATE_OK:UPDATE_ERR,flag);
    }

    @DeleteMapping( "/{id}")
    public Result delete(@PathVariable Integer id) {
        boolean flag = bookService.delete(id);
        return new Result(flag?DELETE_OK:DELETE_ERR,flag);
    }

    @GetMapping("/{id}")
    public Result getById(@PathVariable Integer id) {

        Book book = bookService.getById(id);
        Integer code = book != null ? GET_OK:GET_ERR;
        String msg = book != null ?  "" : "数据查询失败";
        return new Result(code,book,msg)  ;
    }

    @GetMapping
    public Result getAll() {
        List<Book> bookList = bookService.getAll();
        Integer code = bookList != null ? GET_OK:GET_ERR;
        String msg = bookList != null ?  "" : "数据查询失败";
        return new Result(code,bookList,msg)  ;
    }
}

异常处理器

出现异常常见位置与常见诱因如下

1.框架内部抛出的异常:因使用不合规导致

2.数据层抛出的异常:因为外部服务器故障导致(例如:服务器访问超时)

3.业务层抛出的异常:因业务逻辑书写错误导致(例如:不匹配的数据类型间导致异常)

4.表现层抛出的异常:因数据收集、校验等规则导致(例如:不匹配的数据类型间导致异常)

5.工具类抛出的异常:因工具类书写不严谨不够健壮导致(例如:必要时放的连接长期未释放等)

各层均会出现异常,为集中处理各层所有的异常

应该: 所有的异常均抛出到表现层进行处理

异常处理器

集中的、统一的处理项目中出现的异常

java 复制代码
package com.cacb.controller;


import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class ProjectExceptionAdvice {
    @ExceptionHandler(Exception.class)
    public Result doException(Exception ex){
        System.out.println("处理异常");
        return new Result(1111,null);
    }
}

项目异常处理方案

项目异常分类

业务异常(BusinessException)

规范的用户行为产生的异常

不规范的用户行为操作产生的异常

(发送对应消息传递给用户,提醒规范操作)

系统异常(SystemException)

项目运行过程中可预计且无法避免的异常

(发送固定信息传递给用户,安抚用户)

(发送特定消息给运维人员,提醒维护)

(记录日志)

其他异常(Exception)

编程人员未预期到的异常

(发送固定信息传递给用户,安抚用户)

(发送特定消息给运维人员,提醒维护)

(纳入预期范围内)

(记录日志)

处理步骤

第一步、自定义项目系统级异常

java 复制代码
package com.cacb.exception;

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


}

第二步、自定义项目业务级异常

java 复制代码
package com.cacb.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;
    }


}

第三步、自定义异常编码

java 复制代码
    public static final Integer SYSTEM_ERR = 50001;
    public static final Integer BUSINESS_ERR = 50002;
    public static final Integer SYSTEM_UNKNOW_ERR = 59999;

第四步、触发自定义异常

java 复制代码
    @Override
    public boolean delete(Integer id) {
        if (id < 0)
        {
            throw new BusinessException(Code.BUSINESS_ERR,"输入ID非法!");
        }
        bookDao.delete(id);
        return true;
    }

第五步、拦截并处理异常

java 复制代码
package com.cacb.controller;


import com.cacb.exception.BusinessException;
import com.cacb.exception.SystemException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import static com.cacb.controller.Code.SYSTEM_UNKNOW_ERR;

@RestControllerAdvice
public class             ProjectExceptionAdvice {
    @ExceptionHandler(SystemException.class)
    public Result doException(SystemException ex){
        //记录日志
        //发消息给运维
        //发送邮件给开哦发人员,ex对象发送给2开发人员
        return new Result(ex.getCode(),null,ex.getMessage());
    }

    @ExceptionHandler(BusinessException.class)
    public Result doException(BusinessException ex){
        //记录日志
        //发消息给运维
        //发送邮件给开哦发人员,ex对象发送给2开发人员
        return new Result(ex.getCode(),null,ex.getMessage());
    }

    @ExceptionHandler(Exception.class)
    public Result doException(Exception ex){
        return new Result(SYSTEM_UNKNOW_ERR,null,ex.getMessage());
    }
}
相关推荐
for_ever_love__5 分钟前
LangChain Token 计数与成本控制:先知道钱花在哪
开发语言·langchain
m0_547486666 分钟前
《数据结构 (C语言)》期末试卷及答案(10套)2026版
c语言·开发语言·数据结构
顽疲7 分钟前
Java vue 养老系统源码详解:入住核算单 live-check 缴费入账与预交金收据实践
java·vue.js·python·java 养老·springboot 养老·vue养老
Sand(ContextGate)9 分钟前
从开发者调试工具到消费级 App:一个 AI 电商导购项目的 C 端改造与 6 个连环踩坑实录
开发语言·人工智能·python·ai·langchain
共饮一杯无13 分钟前
LiveKit本地录制落盘路径排查与修复实践
java·go·livekit
白杨尚青14 分钟前
C++入门篇(十七):priority_queue 完整模拟实现——仿函数、区间建堆与指针特化(附完整代码仓库)
开发语言·c++·stl·仿函数
StevenLdh25 分钟前
第八期 · 情绪闯关挑战盒:一个「无惩罚」成就系统的数据建模
java·微信小程序
逐光者93328 分钟前
滤波器的 R 与 C 如何选择:从截止频率到工程实践
c语言·开发语言·r语言
Eider199833 分钟前
大模型输出格式幻觉解决思路
开发语言·前端·javascript
Wang's Blog33 分钟前
Java 项目实战: 交友项目 - 入门案例:编写 Dubbo 服务消费者
java·dubbo·交友