首页 > 其他分享 >Spring Boot中基于JSR 303校验的完整教程

Spring Boot中基于JSR 303校验的完整教程

时间:2025-01-02 15:00:31浏览次数:6  
标签:String Spring 303 Boot 校验 springframework org import public

Spring Boot中基于JSR 303校验的完整教程

介绍

JSR 303是一个Java标准,用于控制与校验模型数据。Spring Boot完全支持JSR 303,通过配合\u注解,可以实现自动校验并提供便捷的错误信息传递机制。

添加依赖

在Spring Boot项目中,您需要添加Hibernate Validator依赖,这是应用最普及的JSR 303实现。

在Maven项目中:

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

在Gradle项目中:

implementation 'org.springframework.boot:spring-boot-starter-validation'

根本模型校验

定义模型

以用户注册为例,举一个基本的模型定义:

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;

public class UserRegistrationDTO {

    @NotBlank(message = "用户名不能为空")
    @Size(min = 3, max = 50, message = "用户名长度必须在3到50之间")
    private String username;

    @NotBlank(message = "邮箱地址不能为空")
    @Email(message = "请输入有效的邮箱地址")
    private String email;

    @NotBlank(message = "密码不能为空")
    @Size(min = 6, message = "密码至少要6位")
    private String password;

    // 加入getter和setter
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

接口接收参数校验

接口采用@RestController和@RequestBody解析输入参数:

import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import jakarta.validation.Valid;

@RestController
@Validated
public class UserRegistrationController {

    @PostMapping("/register")
    public ResponseEntity<String> registerUser(@RequestBody @Valid UserRegistrationDTO user) {
        return ResponseEntity.ok("用户注册成功!");
    }
}

注意:

  • 需要在参数前加上@Valid注解,以使校验生效。
  • 对接口增加@Validated注解以启用Spring校验机制。

实现自定义校验器

对于更复杂的校验,可以通过自定义校验器实现。

以验证手机号格式为例:

自定义校验注解

import jakarta.validation.Constraint;
import jakarta.validation.Payload;

import java.lang.annotation.*;

@Documented
@Constraint(validatedBy = PhoneNumberValidator.class)
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidPhoneNumber {
    String message() default "手机号格式不正确";

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

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

实现校验器

import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

public class PhoneNumberValidator implements ConstraintValidator<ValidPhoneNumber, String> {

    private static final String PHONE_REGEX = "^\\d{10,15}$";

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return value != null && value.matches(PHONE_REGEX);
    }
}

模型中使用

import jakarta.validation.constraints.NotBlank;

public class UserRegistrationDTO {

    @NotBlank
    @ValidPhoneNumber
    private String phoneNumber;

    // 其他字段保持不变

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
}

错误信息处理

在默认情况下,校验失败将会抛出MethodArgumentNotValidException。我们可以通过自定义应答处理器:

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;
import java.util.Map;

@RestControllerAdvice
public class ValidationExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Object> handleValidationExceptions(MethodArgumentNotValidException ex) {
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error ->
                errors.put(error.getField(), error.getDefaultMessage()));
        return new ResponseEntity<>(errors, new HttpHeaders(), HttpStatus.BAD_REQUEST);
    }
}

结论

通过使用JSR 303校验,可以最大限度地清除逻辑中的校验代码,使以大量的校验解耦在模型和自定义校验器中。在使用时,您还可以根据项目需要选择选用Hibernate Validator和Spring Boot提供的解决方案。

标签:String,Spring,303,Boot,校验,springframework,org,import,public
From: https://www.cnblogs.com/anyongkang/p/18647694

相关文章