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. }  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章