Spring Boot 实现各种参数校验

数据科学实验室 2024-03-06 ⋅ 22 阅读

引言

在实际的软件开发中,对于用户输入的数据,我们需要进行有效性验证和参数校验。Spring Boot 提供了很多方便的方式来实现参数校验,本篇博客将介绍不同的参数校验方式,并演示如何使用它们。

1. 基本参数校验

Spring Boot 内置了一些基本的参数校验注解,以实现常见的参数校验需求。以下是一些示例:

  • @NotNull:检查字段是否为 null。
  • @NotEmpty:检查字段是否为空。
  • @Min:检查字段是否是一个指定的最小值。
  • @Max:检查字段是否是一个指定的最大值。
  • @Size:检查字段的大小是否在指定范围内。
  • @Pattern:检查字段是否匹配指定的正则表达式。

下面是一个简单的示例,演示如何使用这些基本的参数校验注解:

@RestController
public class UserController {

    @PostMapping("/user")
    public String createUser(@Valid @RequestBody User user) {
        // 处理创建用户的逻辑
        return "User created successfully";
    }
}

public class User {

    @NotNull
    private String name;

    @NotEmpty
    private String email;

    @Min(18)
    private int age;

    // Getters and setters
}

在上述示例中,@Valid 注解用于标识需要进行参数校验的对象,@RequestBody 用于指示参数是从请求体中获取的。当参数校验失败时,Spring Boot 将自动返回相应的错误信息。

2. 自定义参数校验注解

除了使用内置的注解,我们还可以自定义参数校验注解,以实现更复杂的参数校验需求。自定义参数校验注解可以通过创建自定义注解和相应的校验器来实现。

以下是一个示例,演示如何自定义参数校验注解:

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = EmailValidator.class)
public @interface Email {

    String message() default "Invalid email";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

public class EmailValidator implements ConstraintValidator<Email, String> {

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 实现自定义的邮箱校验逻辑
    }
}

@RestController
public class UserController {

    @PostMapping("/user")
    public String createUser(@Valid @RequestBody User user) {
        // 处理创建用户的逻辑
        return "User created successfully";
    }
}

public class User {

    @NotNull
    private String name;

    @Email
    private String email;

    @Min(18)
    private int age;

    // Getters and setters
}

在上述示例中,我们创建了一个名为 @Email 的自定义注解,并实现了相应的校验器 EmailValidator。在 User 类中,我们使用了这个自定义注解来对 email 字段进行校验。

3. 全局异常处理

在进行参数校验时,如果有校验失败的情况,Spring Boot 将自动返回错误信息。但是,我们也可以自定义全局异常处理器,以便对校验失败的异常进行统一处理。

以下是一个示例,演示如何自定义全局异常处理器:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    public ErrorResponse handleValidationException(MethodArgumentNotValidException ex) {
        BindingResult bindingResult = ex.getBindingResult();
        List<ObjectError> objectErrors = bindingResult.getAllErrors();

        List<String> errors = objectErrors.stream()
                .map(DefaultMessageSourceResolvable::getDefaultMessage)
                .collect(Collectors.toList());

        return new ErrorResponse("Validation failed", errors);
    }
}

public class ErrorResponse {

    private String message;
    private List<String> errors;

    // Getters and setters
}

在上述示例中,GlobalExceptionHandler 类使用 @ControllerAdvice 注解来定义全局异常处理器,@ExceptionHandler 标记了处理 MethodArgumentNotValidException 类型异常的方法。在该方法中,我们从异常中获取错误信息,并返回自定义的错误响应 ErrorResponse 对象。

结论

本篇博客介绍了 Spring Boot 实现各种参数校验的方法,包括使用内置的基本参数校验注解和自定义参数校验注解,以及如何自定义全局异常处理器。通过合理地使用这些参数校验方式,我们可以有效地验证用户输入的数据,并统一处理校验失败的异常。


全部评论: 0

    我有话说: