Spring boot 开发 web 项目有时候我们需要对 controller 层传过来的参数进行一些基本的校验, 比如非空, 整数值的范围, 字符串的长度, 日期, 邮箱等等. Spring 支持 JSR-303 Bean Validation API, 可以方便的进行校验.
使用注解进行校验
先定义一个 form 的封装对象
- 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.
- @ResponseBody
- @GetMapping(value = "bean")
- public String validate(@Valid RequestForm request) {
- System.out.println(request.getName());
- return "OK";
- }
自定义注解
如果内置的注解不够用, 可以自定义注解.
比如先定义一个注解 NameConstraint, 限制 name 字段只能从特定数据中选取.
- @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 要求的字段, 想了解的请看官方文档 http://docs.jboss.org/hibernate/validator/4.3/reference/en-US/html_single/
再定义一个 validator 做真正的校验
- 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 中按如下方式使用
- 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 字段, 不想封装一个对象怎么办? 可以直接校验该参数
- @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 注解.
详细信息可以参考官方文档有关章节
- https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#boot-features-validation
- https://docs.spring.io/spring/docs/4.3.16.RELEASE/spring-framework-reference/htmlsingle/#validation-beanvalidation
代码在 github
https://github.com/kabike/spring-boot-demo
来源: http://www.jianshu.com/p/88610959cbc7