【Tools】SpringBoot 统一返回数据、统一参数校验、统一异常处理的基础使用

一、创建项目

创建Maven项目,JDK1.8
在这里插入图片描述

引入Maven依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.0</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

创建配置文件application.yml、启动类App、测试接口TestController

server:
  port: 8088
@SpringBootApplication
public class App {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(App.class, args);
    }
}
@RestController
public class TestController {
    
    
    @GetMapping("/drone")
    public ResponseEntity test(){
    
    
        return  ResponseEntity.ok("Hello World!");
    }
}

访问测试
在这里插入图片描述

二、统一返回数据

返回状态码

@Getter
@AllArgsConstructor
public enum ReturnCode {
    
    

    RC200(200,"操作成功"),
    RC500(500,"操作失败");

    private int code;
    private String msg;
}

封装返回结果

@Data
public class ReturnData<T> implements Serializable {
    
    
    //请求状态
    private boolean success = false;
    //返回状态码
    private int code;
    //返回数据
    private String msg;
    //接口请求时间
    private long timestamp;
    //返回结果
    private T result;

    public ReturnData() {
    
    
        this.timestamp = System.currentTimeMillis();
    }

    public static <T> ReturnData<T> success(T result) {
    
    
        ReturnData<T> data = new ReturnData<>();
        data.setSuccess(true);
        data.setCode(ReturnCode.RC200.getCode());
        data.setMsg(ReturnCode.RC200.getMsg());
        data.setResult(result);
        return data;
    }

    public static <T> ReturnData<T> success(int code, String msg, T result) {
    
    
        ReturnData<T> data = new ReturnData<>();
        data.setSuccess(true);
        data.setCode(code);
        data.setMsg(msg);
        data.setResult(result);
        return data;
    }

    public static <T> ReturnData<T> failure(T result) {
    
    
        ReturnData<T> data = new ReturnData<>();
        data.setSuccess(false);
        data.setCode(ReturnCode.RC500.getCode());
        data.setMsg(ReturnCode.RC500.getMsg());
        data.setResult(result);
        return data;
    }

    public static <T> ReturnData<T> failure(int code, String msg) {
    
    
        ReturnData<T> data = new ReturnData<>();
        data.setSuccess(false);
        data.setCode(code);
        data.setMsg(msg);
        return data;
    }
}

测试接口

    @GetMapping("/testReturnData")
    public ReturnData testReturnData() {
    
    
        return ReturnData.success("hello world");
    }

访问测试
在这里插入图片描述

三、统一参数校验(Validator + 自动抛出异常)

内置参数校验注解:
在这里插入图片描述

创建入参对象,使用注解校验

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    
    
    @NotNull(message = "用户id不能为空")
    private Long id;

    @NotNull(message = "用户账号不能为空")
    @Size(min = 6, max = 11, message = "账号长度必须是6-11个字符")
    private String account;

    @NotNull(message = "用户密码不能为空")
    @Size(min = 6, max = 11, message = "密码长度必须是6-16个字符")
    private String password;

    @NotNull(message = "用户邮箱不能为空")
    @Email(message = "邮箱格式不正确")
    private String email;
}

测试接口(使用注解@Validated)

    @PostMapping("/testUser")
    public ReturnData testUser(@RequestBody @Validated User user){
    
    
        return ReturnData.success(user);
    }

四、统一异常处理

创建统一异常处理类MyExceptionHandler

@RestControllerAdvice
public class MyExceptionHandler {
    
    

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ReturnData MethodArgumentNotValidException(MethodArgumentNotValidException e){
    
    
        List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
        List<String> collect = fieldErrors.stream()
                .map(DefaultMessageSourceResolvable::getDefaultMessage)
                .collect(Collectors.toList());
        return ReturnData.failure(collect);
    }
}

请求测试
在这里插入图片描述

自定义异常类APIException

@Getter
public class APIException extends RuntimeException{
    
    
    private Integer errCode;
    private String errMsg;

    public APIException(Integer errCode, String errMsg, Exception e){
    
    
        super(e);
        this.errCode = errCode;
        this.errMsg = errMsg;
    }
}

在MyExceptionHandler异常处理器添加方法

    @ExceptionHandler(APIException.class)
    public ServiceResult APIException(APIException e){
    
    
        return ServiceResult.failure(e.getErrCode(),e.getErrMsg());
    }

测试接口

    @GetMapping("/testAPIException")
    public ReturnData testAPIException(){
    
    
        try {
    
    
            int i = 1/0;
            return ReturnData.success(i);
        }catch (Exception e){
    
    
            throw new APIException(300,"代码错误");
        }
    }

请求测试
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42029283/article/details/128800506
今日推荐