Spring boot校验

   spring boot 1.4默认使用 hibernate validator 5.2.4 Final实现校验功能。hibernate validator 5.2.4 Final是

     JSR  349 Bean Validation 1.1的具体实现。

 

 一  初步使用

     hibernate vilidator主要使用注解的方式对bean进行校验,初步的例子如下所示:

 

Java代码   收藏代码
  1. package com.learn.validate.domain;  
  2. import javax.validation.constraints.Min;  
  3. import org.hibernate.validator.constraints.NotBlank;  
  4. public class Student {  
  5. //在需要校验的字段上指定约束条件  
  6.  @NotBlank  
  7.  private String name;  
  8.  @Min(3)  
  9.  private int age;  
  10.  @NotBlank  
  11.  private String classess;  
  12.   
  13.   public String getName() {  
  14.   return name;  
  15.  }  
  16.  public void setName(String name) {  
  17.   this.name = name;  
  18.  }  
  19.  public int getAge() {  
  20.   return age;  
  21.  }  
  22.  public void setAge(int age) {  
  23.   this.age = age;  
  24.  }  
  25.  public String getClassess() {  
  26.   return classess;  
  27.  }  
  28.  public void setClassess(String classess) {  
  29.   this.classess = classess;  
  30.  }  
  31.    
  32. }  

 

    然后在controller中可以这样调用,加上@Validated注解即可。

 

Java代码   收藏代码
  1. package com.learn.validate.controller;  
  2. import org.springframework.validation.annotation.Validated;  
  3. import org.springframework.web.bind.annotation.RequestMapping;  
  4. import org.springframework.web.bind.annotation.RestController;  
  5.   
  6. import com.learn.validate.domain.Student;  
  7.   
  8. @RestController  
  9. public class ValidateController {  
  10.   
  11.  @RequestMapping(value="testStudent")  
  12.  public void testStudent(@Validated Student student) {  
  13.  }  
  14. }  

 

    如果校验失败,默认会返回Spring boot 框架的出错信息。是一个json串,里面有详细的出错描述。

 

二 使用gruops 属性来实现区别不同的校验需求

    在上面的例子中,如果Student bean想要用于两个不同的请求中,每个请求有不同的校验需求,例如一个

    请求只需要校验name字段,一个请求需要校验name和age两个字段,那该怎么做呢?

    使用注解的groups属性可以很好的解决这个问题,如下所示:

 

Java代码   收藏代码
  1. package com.learn.validate.domain;  
  2. import javax.validation.constraints.Min;  
  3.   
  4. import org.hibernate.validator.constraints.NotBlank;  
  5.   
  6. public class Student {  
  7. //使用groups属性来给分组命名,然后在需要的地方指定命令即可  
  8. @NotBlank(groups=NAME.class)  
  9. private String name;  
  10. @Min(value=3,groups=AGE.class)  
  11. private int age;  
  12. @NotBlank  
  13. private String classess;  
  14. public String getName() {  
  15. return name;  
  16. }  
  17. public void setName(String name) {  
  18. this.name = name;  
  19. }  
  20. public int getAge() {  
  21. return age;  
  22. }  
  23. public void setAge(int age) {  
  24. this.age = age;  
  25. }  
  26. public String getClassess() {  
  27. return classess;  
  28. }  
  29. public void setClassess(String classess) {  
  30. this.classess = classess;  
  31. }  
  32. public interface NAME{};  
  33. public interface AGE{};  
  34.   
  35. }  

 

   根据需要在@Validated属性中指定需要校验的分组名,可以指定1到多个。指定到的分组名会全部进行校验

   ,不指定的不校验。

 

Java代码   收藏代码
  1. package com.learn.validate.controller;  
  2.   
  3. import org.springframework.validation.annotation.Validated;  
  4. import org.springframework.web.bind.annotation.RequestMapping;  
  5. import org.springframework.web.bind.annotation.RestController;  
  6.   
  7. import com.learn.validate.domain.Student;  
  8. import com.learn.validate.domain.Student.AGE;  
  9. import com.learn.validate.domain.Student.NAME;  
  10.   
  11. @RestController  
  12. public class ValidateController {  
  13.   
  14. @RequestMapping(value="testStudent")  
  15. public void testStudent(@Validated Student student) {  
  16. }  
  17. @RequestMapping(value="testStudent1")  
  18. public void testStudent1(@Validated(NAME.class) Student student) {  
  19. }  
  20. @RequestMapping(value="testStudent2")  
  21. public void testStudent2(@Validated({NAME.class,AGE.class})   
  22.     Student student) {  
  23. }  
  24. }  

 

三  使用 @ScriptAssert 注解校验复杂的业务逻辑

     如果需要校验的业务逻辑比较复杂,简单的@NotBlank,@Min注解已经无法满足需求了,这时可以使用            @ScriptAssert 来指定进行校验的方法,通过方法来进行复杂业务逻辑的校验,然后返回 true或false来表

     明是否校验成功。例如下面的例子:

 

Java代码   收藏代码
  1. package com.learn.validate.domain;  
  2. import javax.validation.constraints.Min;  
  3.   
  4. import org.hibernate.validator.constraints.NotBlank;  
  5. import org.hibernate.validator.constraints.ScriptAssert;  
  6.   
  7. import com.learn.validate.domain.Student.CHECK;  
  8. //通过script 属性指定进行校验的方法,传递校验的参数,  
  9. //依然可以通过groups属性指定分组名称  
  10. @ScriptAssert(lang="javascript",script="com.learn.validate.domain  
  11. .Student.checkParams(_this.name,_this.age,_this.classes)",  
  12. groups=CHECK.class)  
  13. public class Student {  
  14.    
  15.  @NotBlank(groups=NAME.class)  
  16.  private String name;  
  17.  @Min(value=3,groups=AGE.class)  
  18.  private int age;  
  19.  @NotBlank  
  20.  private String classess;  
  21.    
  22.  public String getName() {  
  23.   return name;  
  24.  }  
  25.  public void setName(String name) {  
  26.   this.name = name;  
  27.  }  
  28.  public int getAge() {  
  29.   return age;  
  30.  }  
  31.  public void setAge(int age) {  
  32.   this.age = age;  
  33.  }  
  34.  public String getClassess() {  
  35.   return classess;  
  36.  }  
  37.  public void setClassess(String classess) {  
  38.   this.classess = classess;  
  39.  }  
  40.    
  41.  public interface NAME{};  
  42.    
  43.  public interface AGE{};  
  44.    
  45.  public interface CHECK{};  
  46.    
  47.  //注意进行校验的方法要写成静态方法,否则会出现   
  48.  //TypeError: xxx is not a function 的错误  
  49.  public static boolean checkParams(String name,int age,String classes) {  
  50.   if(name!=null&&age>8&classes!=null)  
  51.   {  
  52.    return true;  
  53.   }  
  54.   else  
  55.   {  
  56.    return false;  
  57.   }  
  58.     
  59.  }  
  60.   
  61. }  

 

    在需要的地方,通过分组名称进行调用。

 

Java代码   收藏代码
  1. package com.learn.validate.controller;  
  2.   
  3. import org.springframework.validation.annotation.Validated;  
  4. import org.springframework.web.bind.annotation.RequestMapping;  
  5. import org.springframework.web.bind.annotation.RestController;  
  6.   
  7. import com.learn.validate.domain.Student;  
  8. import com.learn.validate.domain.Student.CHECK;  
  9.   
  10. @RestController  
  11. public class ValidateController {  
  12.    
  13.  @RequestMapping(value="testStudent3")  
  14.  public void testStudent3(@Validated(CHECK.class) Student student) {  
  15.     
  16.  }  
  17. }  

 

猜你喜欢

转载自blog.csdn.net/suo082407128/article/details/80228549