spring boot — validator框架
几种常用的注解
注解 | 功能 |
---|---|
@Null | 被注释的元素必须为 null |
@NotNull | 被注释的元素必须不为 null |
@AssertTrue | 被注释的元素必须为 true |
@AssertFalse | 被注释的元素必须为 false |
@Min(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@Max(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@DecimalMin(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@DecimalMax(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@Size(max=, min=) | 被注释的元素的大小必须在指定的范围内 |
@Digits (integer, fraction) | 注释的元素必须是一个数字,其值必须在可接受的范围内 |
@Past | 被注释的元素必须是一个过去的日期 |
@Future | 被注释的元素必须是一个将来的日期 |
@Pattern(regex=,flag=) | 被注释的元素必须符合指定的正则表达式 |
注解(Hibernate附加的 Validator) | 功能 |
---|---|
@NotBlank(message =) | 验证字符串非null,且长度必须大于0 |
被注释的元素必须是电子邮箱地址 | |
@Length(min=,max=) | 被注释的字符串的大小必须在指定的范围内 |
@NotEmpty | 被注释的字符串的必须非空 |
@Range(min=,max=,message=) | 被注释的元素必须在合适的范围内 |
一、基本验证
- 代码1
/*新建一个加验证的实体类用*/
import org.hibernate.validator.constraints.NotBlank;
import javax.validation.constraints.AssertFalse;
import javax.validation.constraints.Pattern;
public class DemoModel {
@NotBlank(message="用户名不能为空")
private String name;
@NotNull(message="生日不能为空")
@Pattern(regexp="^[0-9]{4}-[0-9]{2}-[0-9]{2}$",message="出生日期格式不正确")
private String birthday;
@Max(value=10,message="最大值不能大于10")
private String maxValue;
@Min(value=5,message="最小值不能小于5")
private String minValue;
@NotBlank
@Length(max = 4,min = 2,message = "长度应该在2-4之间")
private String lengthValue;
...省略geter/setter
}
- 代码2
/*Controller*/
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
import java.util.Date;
import java.util.List;
@RestController
@RequestMapping("valBean/")
public class ValidateBeanController {
@RequestMapping("demo")
public void demo2(@Valid DemoModel demo, BindingResult result){
System.out.println("**********开始demo2**********" + new Date());
//如果验证通不过的处理
if(result.hasErrors())
{
List<FieldError> fieldErrors=result.getFieldErrors();
for (FieldError error : fieldErrors)
{
//打印错误
System.out.println("字段名:"+error.getField()+",值:"+error.getRejectedValue()+",异常信息:"+error.getDefaultMessage());
}
}
System.out.println("**********结束demo2**********" + new Date());
}
测试链接:http://localhost:8080/test/valBean/demo?name=&birthday=&maxValue=1
控制台输出:
**********开始demo2**********Mon Feb 05 17:47:38 CST 2018
字段名:minValue,值:null,异常信息:不能为null
字段名:birthday,值:,异常信息:出生日期格式不正确
字段名:lengthValue,值:null,异常信息:不能为空
字段名:name,值:,异常信息:用户名不能为空
字段名:maxValue,值:11,异常信息:最大值不能大于10
**********结束demo2**********Mon Feb 05 17:47:38 CST 2018
二、自定义验证
- 代码3
新建一个annotation接口类
import aaa.annotation.validator.MoneyValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MoneyValidator.class ) //对应代码4的实现类
public @interface Money {
String message() default "金额应为非负数,最多保留小数点后两位!";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
- 代码4
新建一个接口实现类
/*
* Moblie对应代码3的接口类
* RegexpUtil.MOBILE_REGEXP 正则表达式
* 也可以不用正则,用代码进行判断,返回结果是boolean即可
*/
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class MoblieValidator implements ConstraintValidator<Moblie,Object>
{
@Override
public void initialize(Moblie moblie) {
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext constraintValidatorContext) {
if (!RegexpUtil.isValidate((String)value, RegexpUtil.MOBILE_REGEXP)) {
return false;
}
return true;
}
}
控制台输出:
**********开始demo2**********Tue Feb 06 09:37:48 CST 2018
字段名:money,值:null,异常信息:金额应为非负数,最多保留小数点后两位!
字段名:lengthValue,值:null,异常信息:不能为空
字段名:birthday,值:888,异常信息:出生日期格式不正确
字段名:minValue,值:null,异常信息:不能为null
字段名:name,值:,异常信息:用户名不能为空
**********结束demo2**********Tue Feb 06 09:37:48 CST 2018
注意:测试时需要通过hppt请求,不能直接通过测试类调用。