javax.validation.Valid
@Valid启用实体类中的自定义注解,BindingResult 用来返回错误信息
//import org.springframework.validation.BindingResult;
//import org.springframework.validation.Errors;
public Xxxx login(@Valid xxxModel , BindingResult bindingResult){
if(bindingResult.hasErrors()){//返回具体的错误信息
System.out.println("message="+bindingResult.getFieldError().getDefaultMessage()); //返回的具体信息
}
}
public Xxxx login(@Valid xxxModel , Errors errors){
if(errors != null && errors.hasErrors()){
String message = errors.getAllErrors().stream()
.filter(objectError -> objectError instanceof FieldError)
.map(objectError -> {
FieldError fieldError = (FieldError) objectError;
return "{" + fieldError.getField() + "}" + fieldError.getDefaultMessage();
})
.collect(Collectors.joining(";"));
System.out.println("message="+message);
}
}
常用的自定义注解
@NotEmpty(message = "password 为空") //javax.validation.constraints.NotEmpty;
@Min //不能低于某个值
@AssertFalse //该字段为false时才能验证通过
@AssertTrue //该字段为true时才能验证通过
@DecimalMax //验证小数的最大值@DecimalMax(value = "12.35")
@DecimalMin //验证小数的最小值
@Digits(integer = 2, fraction = 2) //验证数字的整数位和小数位的位数是否超过指定的长度 private double money;
---日期---
@Future //必须在当前日期之后 private Date date;
@Past //必须在当前日期之前 private Date date ;
@Pattern(regexp = "[abc]") //与给定的正则相配制
自己实现自定义校验注解
自定义的注解里必须有这几样要素
a. String message() default "";
b. public Class<?>[] groups() default {};
c. Class<? extends Payload>[] payload() default {};
@Constraint(validatedBy = Xxxx.class) 指定具体的约束类(也可以为内部类) 用来实现自定义的校验规则
import javax.validation.ConstraintValidator;
import com.qbsea.mysboot2common.modlues.app.service.AppService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
@Target({FIELD,METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {MqbStringChecker.IsMobileValidator.class})
@Inherited
@Documented
public @interface MqbStringChecker {
String message() default "手机号不正确";
public Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
@Service
class IsMobileValidator implements ConstraintValidator<MqbStringChecker,String> {
@Autowired
AppService appService;
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
System.out.println(appService.findBy().get());
if(value.startsWith("150")){//测试不能能150开头的手机号
return false;
}
return true;
}
}
}