SpringBoot统一返回处理和全局异常处理

亦凉 2024-03-01 08:07 146阅读 0赞

统一接口返回

前后端分离项目,通常后端会返回给前端统一的数据格式,一般包括code,msg,data信息。
创建返回统一实体类

  1. package com.example.exceptionspring.domain;
  2. import lombok.Data;
  3. @Data
  4. public class Result {
  5. private Integer code;
  6. private String msg;
  7. public Object data;
  8. public Result(Integer code, String msg) {
  9. this.code = code;
  10. this.msg = msg;
  11. }
  12. public Result(ErrorEnum error) {
  13. this.code=error.getCode();
  14. this.msg=error.getMsg();
  15. }
  16. public Result() {
  17. }
  18. }

创建枚举类,定义code和msg信息

  1. package com.example.exceptionspring.domain;
  2. public enum ErrorEnum {
  3. SUCCESS(200,"操作成功"),
  4. NOT_AUTH(401,"没有权限"),
  5. NOT_FOUND(404,"找不到资源"),
  6. ERROR(500,"系统错误");
  7. private Integer code;
  8. public String msg;
  9. ErrorEnum(Integer code,String msg) {
  10. this.code=code;
  11. this.msg=msg;
  12. }
  13. public Integer getCode() {
  14. return code;
  15. }
  16. public void setCode(Integer code) {
  17. this.code = code;
  18. }
  19. public String getMsg() {
  20. return msg;
  21. }
  22. public void setMsg(String msg) {
  23. this.msg = msg;
  24. }
  25. }

" class="reference-link">返回测试 在这里插入图片描述

全局异常处理

Exception异常在开发中难免会碰到,使用之前的处理方法try{}catch{}会造成大量的代码重复,每个接口都需要try{}catch{},代码会变得臃肿,SpringBoot为解决这一问题,推出了全局异常处理,通过注解@RestControllerAdvice@ExceptionHandler很好的进行控制。
本篇文章通过在Controller层和Service层演示异常的处理方式。
Controller层演示模拟java经典异常int i=i/0;不使用数据库模拟异常

  • 1.新建一个SpringBoot项目,创建项目的目录结构
    在这里插入图片描述
  • 2.新建全局异常处理类GlobalException.java

    package com.example.exceptionspring.exception;

  1. import com.example.exceptionspring.domain.ErrorEnum;
  2. import com.example.exceptionspring.domain.Result;
  3. import org.springframework.web.bind.annotation.ExceptionHandler;
  4. import org.springframework.web.bind.annotation.RestControllerAdvice;
  5. @RestControllerAdvice
  6. public class GlobalException {
  7. @ExceptionHandler(value = Exception.class)
  8. public Result handleException(Exception e){
  9. return new Result(ErrorEnum.ERROR);
  10. }
  11. }

@RestControllerAdvice注解是@ResponseBody+@ControllerAdvice注解,如果在该类使用注解,则方法上不需要添加@ResponseBody ,如果在类上使用@ControllerAdvice注解,则需在方法上添加@ResponseBody注解。
@ExceptionHandler value属性值为具体的异常类型,Exception.class为最顶级异常,所有的异常都继承Exception.class。

  • 3.编写测试接口模拟异常

    package com.example.exceptionspring.controller;

    import com.example.exceptionspring.domain.Result;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;

    @RestController
    public class StudentController {

  1. @GetMapping("/getException")
  2. public Result getException(){
  3. int i=1/0;
  4. return new Result();
  5. }
  6. }

Service层演示通过MySQL数据库模拟异常

    1. 配置数据库连接参数

    spring:
    datasource:

    1. driver-class-name: com.mysql.jdbc.Driver
    2. url: jdbc:mysql://localhost:3306/test
    3. username: root
    4. password: 123456
  • 2.编写方法和sql

    @GetMapping(“/getException1”)

    1. public Result getException1(String username){
    2. studentService.getByName(username);
    3. return new Result(ErrorEnum.SUCCESS);
    4. }

    @Override

    1. public Map<String, Object> getByName(String username) {
    2. Map<String, Object> user = dao.getByName(username);
    3. if(user==null){
    4. throw new ServiceException(ErrorEnum.ERROR.getCode(),"用户不存在");
    5. }
    6. return user;
    7. }

    @Mapper
    public interface StudentDao {

  1. @Select("select * from user where username=#{username}")
  2. Map<String,Object> getByName(String username);
  3. }
  • 3.创建业务异常类,并注册到全局异常处理方法中

    package com.example.exceptionspring.exception;

    import lombok.Data;

    @Data
    public class ServiceException extends RuntimeException{

    1. private Integer code;
    2. private String msg;
    3. public ServiceException(Integer code, String msg) {
    4. this.code = code;
    5. this.msg = msg;
    6. }

    }

GlobalException类中新建handleServiceException方法

  1. @ExceptionHandler(value = ServiceException.class)
  2. public Result handleServiceException(ServiceException e){
  3. return new Result(ErrorEnum.ERROR.getCode(),e.getMsg());
  4. }
  • 4.测试
    在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,146人围观)

还没有评论,来说两句吧...

相关阅读

    相关 springboot异常全局统一处理

    [个人博客][Link 1] 日常后端业务开发中,在提供接口服务时会遇到各种异常处理,通常涉及到参数校验异常、自定义异常以及一些不可预知的异常等等。下面就来说一下在sprin