Spring boot进行参数校验的方法实例详解

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注解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值