Spring6的验证方式

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 多平台发布

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值