自学内容网 自学内容网

SpringBoot参数校验

1.引言

在 Web 开发中,用户输入是系统的主要数据来源,但同时也是潜在的安全隐患。参数校验是确保数据安全性和系统稳定性的关键一环。

  • Spring Boot 的优势:整合了 Bean Validation(JSR 380)和 Hibernate Validator,支持注解式校验。
  • 场景:表单提交、接口调用的参数校验,如必填字段、格式校验、值范围限制等。
  • 使用步骤:

               1.导入validation坐标

               2.在参数上添加注解(例如@pattern),指定校验规则                

               3.在Controller类上添加@Validated注解               

               4.在全局异常处理器中处理参数校验失败异常

使用后:

 

2.参数校验的基本用法 

2.1导入依赖

Spring Boot 内置了 Bean Validation,但需要引入相关依赖(如果未自动导入):

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

2.2基本校验注解

常用注解及其作用:

2.3控制器中的参数校验

在控制器方法中添加校验注解:

import jakarta.validation.constraints.*;

public class UserDTO {
    @NotNull(message = "用户名不能为空")
    @Size(min = 3, max = 20, message = "用户名长度必须在3到20之间")
    private String username;

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

    @Min(value = 18, message = "年龄不能小于18岁")
    @Max(value = 100, message = "年龄不能超过100岁")
    private Integer age;

    // Getters and Setters
}

在控制器中接收并校验参数:

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import jakarta.validation.Valid;

@RestController
@RequestMapping("/users")
@Validated
public class UserController {

    @PostMapping
    public String createUser(@RequestBody @Valid UserDTO userDTO) {
        return "用户创建成功: " + userDTO.getUsername();
    }
}

3.全局异常处理

当校验失败时,Spring 会抛出异常(如 MethodArgumentNotValidException)。可以通过 全局异常处理 返回友好的错误信息。

3.1 自定义异常处理器

使用 @ControllerAdvice 捕获校验异常:

package com.itzx.springbootconfigfile.exception;

import com.itzx.springbootconfigfile.pojo.Result;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public Result handleException(Exception e){
        e.printStackTrace();
        return Result.error(StringUtils.hasLength(e.getMessage())?e.getMessage():"操作失败");
    }


}

3.2 响应示例

当校验失败时,返回类似的 JSON:

{
  "username": "用户名长度必须在3到20之间",
  "email": "邮箱格式不正确"
}

4. 分组校验

分组校验允许根据场景应用不同的校验规则。

4.1 定义校验组

public interface CreateGroup {}
public interface UpdateGroup {}

4.2 应用分组校验

public class UserDTO {
    @NotNull(message = "用户ID不能为空", groups = UpdateGroup.class)
    private Long id;

    @NotNull(message = "用户名不能为空", groups = CreateGroup.class)
    @Size(min = 3, max = 20, message = "用户名长度必须在3到20之间")
    private String username;
}

4.3 控制器中使用分组

@PostMapping
public String createUser(@RequestBody @Validated(CreateGroup.class) UserDTO userDTO) {
    return "用户创建成功";
}

@PutMapping
public String updateUser(@RequestBody @Validated(UpdateGroup.class) UserDTO userDTO) {
    return "用户更新成功";
}

5. 最佳实践

  1. 细化校验规则:根据业务需求精细设计注解和分组。
  2. 前后端配合:校验规则应在后端与前端保持一致。
  3. 避免过度校验:对非关键性字段,校验规则不要过于复杂。
  4. 全局异常捕获:提升用户体验。

6. 总结

Spring Boot 提供了一套强大的参数校验机制,集成了标准的 JSR 380 和自定义能力,适用于各种业务场景。从简单校验到分组校验,再到自定义注解,开发者可以轻松实现符合业务需求的参数校验逻辑。通过合理的异常处理和分组应用,可以进一步提高系统的健壮性和用户体验。


原文地址:https://blog.csdn.net/m0_74004434/article/details/143808375

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!