Spring boot开发web项目有时候我们需要对controller层传过来的参数进行一些基本的校验,比如非空、整数值的范围、字符串的长度、日期、邮箱等等。Spring支持JSR-303 Bean Validation API,可以方便的进行校验。
使用注解进行校验
先定义一个form的封装对象
?
1 2 3 4 5 6 7 8 9 10 | class RequestForm { @Size (min = 1 , max = 5 ) private String name; public String getName() { return name; } public void setName(String name) { this .name = name; } } |
其中name这个字段用Size注解限制长度1到5。Size是javax.validation包中的constraint注解。
在使用时用@Valid注解表示要校验这个bean。
?
1 2 3 4 5 6 | @ResponseBody @GetMapping (value = "bean" ) public String validate( @Valid RequestForm request) { System.out.println(request.getName()); return "OK" ; } |
自定义注解
如果内置的注解不够用,可以自定义注解。
比如先定义一个注解NameConstraint,限制name字段只能从特定数据中选取。
?
1 2 3 4 5 6 7 8 9 | @Target ({ ElementType.FIELD, ElementType.PARAMETER }) @Retention (RetentionPolicy.RUNTIME) @Constraint (validatedBy = NameConstraintValidator. class ) @interface NameConstraint { String[] allowedValues(); Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; String message(); } |
其中allowedValues表示合法的取值范围,message是校验失败的显示信息。
message、groups、payload是hibernate validator要求的字段,想了解的请看官方文档
再定义一个validator做真正的校验
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class NameConstraintValidator implements ConstraintValidator<NameConstraint, String> { private String[] validValues; @Override public void initialize(NameConstraint constraintAnnotation) { validValues = constraintAnnotation.allowedValues(); } @Override public boolean isValid(String value, ConstraintValidatorContext context) { for (String s : this .validValues) { if (s.equals(value)) { return true ; } } return false ; } } |
在form bean中按如下方式使用
?
1 2 3 4 5 6 7 8 9 10 | class RequestFormWithCustomConstraint { @NameConstraint (allowedValues = { "bar" , "foo" }, message = "只允许bar,foo" ) private String name; public String getName() { return name; } public void setName(String name) { this .name = name; } } |
直接校验参数
只有一个name字段,不想封装一个对象怎么办?可以直接校验该参数
?
1 2 3 4 5 6 7 8 9 10 11 | @Controller @Validated @RequestMapping (value = "validator" ) public class ParameterValidatorDemoController { @ResponseBody @GetMapping (value = "simple" ) public String validateParameter( @Size (min = 1 , max = 5 ) String name) { System.out.println(name); return "OK" ; } } |
controller上面的@Validated注解则告诉spring需要扫描这个类,来检查其中的constraint注解。