spring Bean Validation,bean属性校验

spring Bean Validation,bean属性校验

我们在项目中使用的bean,经验要对属性做校验,但是自己写校验会非常麻烦,一个属性一个属性的校验,现在有一种非常简便的方法,使用Bean Validation,Hibernate-validator对 Validation做了扩展:

  • 导入
<dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>6.0.4.Final</version>
</dependency>
  • 普通代码中使用
public class Person {
    @Length(min = 1,max = 5,message = "名字长度必须在1-5之间")
    private String name;
    private int age;
    private String addr;

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getAddr() {
        return addr;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }
}
public class Test {
    public static void main(String args[]) {
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();
        Person p = new Person();
        p.setName("111111111111111");
        Set<ConstraintViolation<Person>> violations = validator.validate(p);

        for(ConstraintViolation<Person> violation: violations) {
            System.out.println(violation.getMessage());
        }

    }
}
运行结果:
    名字长度必须在1-5之间
  • Controller接口上自动封装,校验
有时候Hibernate-validator校验框,和原生 Bean Validation 中内置的 constraint 不能满足我们需求,这时候我们可以自己自定义验证
当前端传递过来bean的时候,要做属性校验,如果不符合我们的预期,给前端返回错误信息。如"名字长度必须在1-5之间",等。
@RestController
public class DemoController {

    @PostMapping("/hello")
    public String printHello(@RequestBody @Valid Person p, BindingResult result) {
        if(result.hasErrors()){
            //这边对bean属性错误消息进行处理
            System.out.println(result.getAllErrors());
        }
        return "hello";
    }
}
  • 自定义校验器
\\邮箱校验器
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = { EmailValidator.class })
public @interface Email {

    String message() default "这不是有效的电子邮件格式";

    String regexp() default "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9]+\\.[a-zA-Z]{2,4}";

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

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

    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
    @Retention(RUNTIME)
    @Documented
    @interface List {

        Email[] value();
    }

}
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * Created by Administrator on 2018/8/19.
 */
public class EmailValidator implements ConstraintValidator<Email, String> {

    private String regexp;

    @Override
    public void initialize(Email constraintAnnotation) {
        //得到@Email 注解属性
        this.regexp = constraintAnnotation.regexp();
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        if(value==null){return true;}
        if( value.matches(regexp)){
            return true;
        }
        return false;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值