欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-05 19:03:04
spring boot开发web项目有时候我们需要对controller层传过来的参数进行一些基本的校验,比如非空、整数值的范围、字符串的长度、日期、邮箱等等。spring...

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要求的字段,想了解的请看官方文档

 再定义一个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


总结

以上所述是小编给大家介绍的spring boot进行参数校验的方法实例详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!