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;
}
}