Spring6的验证方式
在开发中,经常遇到参数校验的需求,比如用户注册的时候,要校验用户名不能为空、用户名长度不超过20个字符、手机号是合法的手机号格式等等。如果使用普通方式,会把校验的代码和真正的业务处理逻辑耦合在一起,而且如果未来要新增一种校验逻辑也需要在修改多个地方。而spring validation允许通过注解的方式来定义对象校验规则,把校验和业务逻辑分离开,让代码编写更加方便。Spring Validation其实就是对Hibernate Validator进一步的封装,方便在Spring中使用。在Spring中有多种校验的方式
1. org.springframework.validation.Validator接口,然后在代码中调用这个类
package com.suda.spring.valdation1;
/**
* @Classname User
* @Description TODO
* @Date 2023/10/12 9:14
* @Created by HP
*/
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class UserValidator implements Validator {
//验证的对象
@Override
public boolean supports(Class<?> clazz) {
return User.class.equals(clazz);
}
//你之前写的js的代码
@Override
public void validate(Object target, Errors errors) {
//name 不能空
ValidationUtils.rejectIfEmpty(errors,"name","name is empty");
//age 1 150 key = value
User user =(User)target;
if(user.getAge()<1){
//错误信息
errors.rejectValue("age","age is error","age<1");
}else if(user.getAge()>150){
errors.rejectValue("age","age is error","age>150");
}
}
}
public class TestUser {
public static void main(String[] args) {
//创建User对象
User user = new User();
user.setName("test");
user.setAge(12);
//DataBinder
DataBinder dataBinder = new DataBinder(user);
//把你验证规则放进去
UserValidator userValidator = new UserValidator();
dataBinder.setValidator(userValidator);
//验证
dataBinder.validate();
//输出验证的结果
BindingResult bindingResult = dataBinder.getBindingResult();
System.out.println(bindingResult.getAllErrors());
}
}
2. Bean Validation方式来进行校验,即通过注解的方式。【后面开发用的比较多】
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.1:.constraints.NotNull;
public class User {
@NotNull
private String name;
@Max(150)
@Min(1)
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
@Service
public class UserValidator1 {
@Autowired
private Validator validator;
public boolean validatorUser(User user){
Set<ConstraintViolation<User>> validaters= validator.validate(user);
return validaters.isEmpty();
}
}
@Service
public class UserValidator2 {
@Autowired
private Validator validator;
public boolean validatorUser(User user){
//验证信息
BindException bindException = new BindException(user,user.getName());
validator.validate(user,bindException);
List<ObjectError> allErrrs = bindException.getAllErrors();
System.out.println(allErrrs);
return bindException.hasErrors();
}
}
@Configuration
@ComponentScan("com.suda.spring.valdation2")
public class AppConfig {
@Bean
public LocalValidatorFactoryBean validator() {
return new LocalValidatorFactoryBean();
}
}
public class TestUserBeanValidator {
@Test
public void testUserBeanValidator1(){
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
UserValidator1 userValidator1 = (UserValidator1) applicationContext.getBean("userValidator1");
User user = new User();
user.setName("admin");
user.setAge(149);
boolean message = userValidator1.validatorUser(user);
System.out.println(message);
}
@Test
public void testUserBeanValidator2(){
ApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(AppConfig.class);
UserValidator2 userValidator2 = (UserValidator2) applicationContext2.getBean("userValidator2");
User user = new User();
user.setName("admin");
user.setAge(18);
boolean message = userValidator2.validatorUser(user);
System.out.println(message);
}
}`
3. 方法实现校验
@Service
@Validated
public class UserService {
public String printUser(@NotNull @Valid User user){
return user.toString();
}
}
@Configuration
@ComponentScan("com.suda.spring.valdation3")
public class AppConfig {
@Bean
public MethodValidationPostProcessor validationPostProcessor() {
return new MethodValidationPostProcessor();
}
}
public class TestUserBeanValidator {
@Test
public void testUserBeanValidator1(){
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = applicationContext.getBean(UserService.class);
User user = new User();
user.setName("admin");
user.setAge(18);
userService.printUser(user);
}
*/
public class User {
@NotNull
private String name;
@Max(150)
@Min(1)
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
4. 自定义校验
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(
validatedBy = {MyConstraintValidation.class}
)
public @interface MyConstraint {
String message() default "赋值中不能含有空格";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface List {
MyConstraint[] value();
}
}
public class MyConstraintValidation implements ConstraintValidator<MyConstraint,String> {
@Override
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
//定义规则
if(value!= null && value.contains(" ")){
//设置信息
String defalutMessage = constraintValidatorContext.getDefaultConstraintMessageTemplate();
System.out.println("defalutMessage=="+defalutMessage);
constraintValidatorContext.disableDefaultConstraintViolation();
//设置自己 格式
constraintValidatorContext.buildConstraintViolationWithTemplate("所有的字符串不能有空格").addConstraintViolation();
return false;
}
return false;
}
}
@Configuration
@ComponentScan("com.suda.spring.myvaldation4")
public class AppConfig {
@Bean
public MethodValidationPostProcessor validationPostProcessor() {
return new MethodValidationPostProcessor();
}
}
@Service
@Validated
public class UserService {
public String printUser(@NotNull @Valid User user){
return user.toString();
}
}
public class User {
@NotNull
private String name;
@Max(150)
@Min(1)
private int age;
@MyConstraint
private String lastname;
//名字不能有空格 " "
//约束随便
//MyConstraint
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class TestUserBeanValidator {
@Test
public void testUserBeanValidator1(){
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = applicationContext.getBean(UserService.class);
User user = new User();
user.setName("admin");
user.setAge(18);
user.setLastname("su da");
userService.printUser(user);
}
}
本文由 mdnice 多平台发布