java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot项目参数校验

SpringBoot项目参数校验过程

作者:明有所思

这段文章主要介绍了SpringBootValidation的核心概念、快速集成与配置、常用校验注解详解以及实战开发步骤等内容,强调了使用SpringBootValidation进行参数校验的优势和具体实现方法

在日常开发中,参数校验是保证系统健壮性的第一道防线。传统的做法是在业务逻辑中穿插大量的if-else判断,这不仅代码臃肿,而且可维护性差。

在Spring Boot项目中通过spring-boot-starter-validation可以很简单的解决这一问题。

一、Spring Boot Validation简介

1.1 什么是spring-boot-starter-validation?

spring-boot-starter-validation是Spring Boot对Bean Validation API(JSR 380)的封装实现,提供了强大的数据校验功能。

有如下优势:

1.2 核心优势

与手动校验相比,Spring Boot Validation具有显著优势:

二、快速集成与配置

2.1 添加依赖

在pom.xml中添加以下依赖即可开始使用:

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

注意:Spring Boot 2.3+版本需要显式引入该依赖,而2.3以下版本可通过spring-boot-starter-web间接依赖。

三、常用校验注解详解

Spring Boot Validation提供了丰富的校验注解,以下是实际开发中最常用的几种:

3.1 空值检查注解

3.2 数值检查注解

3.3 其他常用注解

3.4 注解使用示例

@Data
public class UserDTO {
    @NotBlank(message = "用户名不能为空")
    @Size(min = 2, max = 20, message = "用户名长度必须在2-20个字符之间")
    private String username;
    
    @NotNull(message = "年龄不能为空")
    @Min(value = 18, message = "年龄不能小于18岁")
    @Max(value = 60, message = "年龄不能大于60岁")
    private Integer age;
    
    @Email(message = "邮箱格式不正确")
    private String email;
    
    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
    private String phone;
    
}

四、实战开发步骤

4.1 DTO类定义校验规则

首先在DTO类中定义校验规则,使用合适的注解和错误提示:

@Data
public class UserDTO {
    @NotBlank(message = "用户名不能为空")
    @Size(min = 2, max = 20, message = "用户名长度必须在2-20个字符之间")
    private String username;
    
    @NotNull(message = "年龄不能为空")
    @Min(value = 18, message = "年龄不能小于18岁")
    @Max(value = 60, message = "年龄不能大于60岁")
    private Integer age;
    
    @Email(message = "邮箱格式不正确")
    private String email;
    
    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
    private String phone;
    
}

4.2 Controller层启用校验

在Controller方法参数前添加@Valid@Validated注解启用校验:

@Validated
@RestController
@RequestMapping("/users")
public class UserController {
    
    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody @Valid UserDTO userDTO) {
        // 业务逻辑处理(只有校验通过才会执行到这里)
        return ResponseEntity.ok(userService.create(userDTO));
    }
    
    // 单个参数校验需要在类上添加@Validated
    @GetMapping("/detail")
    public ResponseEntity<User> getUserDetail(@NotBlank String username) {
        // 业务逻辑处理
        return ResponseEntity.ok(userService.findByUsername(username));
    }
}

4.3 统一异常处理

校验失败时会抛出MethodArgumentNotValidExceptionConstraintViolationException异常,我们需要统一处理:

@RestControllerAdvice
public class GlobalExceptionHandler {
    
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        List<String> errors = ex.getBindingResult()
                .getFieldErrors()
                .stream()
                .map(error -> error.getField() + ": " + error.getDefaultMessage())
                .collect(Collectors.toList());
        
        return ResponseEntity.badRequest()
                .body(new ErrorResponse("VALIDATION_FAILED", errors));
    }
    
    @ExceptionHandler(ConstraintViolationException.class)
    public ResponseEntity<ErrorResponse> handleConstraintViolationException(
            ConstraintViolationException ex) {
        
        List<String> errors = ex.getConstraintViolations()
                .stream()
                .map(violation -> violation.getPropertyPath() + ": " + violation.getMessage())
                .collect(Collectors.toList());
        
        return ResponseEntity.badRequest()
                .body(new ErrorResponse("PARAMETER_VALIDATION_FAILED", errors));
    }
}

4.4 ErrorResponse

@Data
public class ErrorResponse {
    private String msg;
    private Object errors;
    public ErrorResponse(String msg, Object data) {
        this.msg = msg;
        this.errors = data;
    }
}

五、常见问题与解决方案

5.1 校验不生效的常见原因

  1. 缺少@Valid注解:在Controller方法参数前忘记添加@Valid或@Validated
  2. 错误异常处理:覆盖了默认的异常处理逻辑
  3. 静态嵌套类:DTO使用static内部类导致无法实例化
  4. 字段访问权限:校验字段需要提供getter方法

六、总结

通过本文的学习,相信你已经掌握了Spring Boot Validation的核心用法。在实际项目中,遵循以下最佳实践可以让你的代码更加健壮:

6.1 分层校验原则

6.2 错误消息规范

6.3 性能优化建议

Spring Boot Validation的强大功能让参数校验变得简单而高效。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文