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