<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Hibernate-validator校驗框架

      轉載:http://blog.csdn.net/xgblog/article/details/52548659

      1前言

      Validator開發者使用手冊,適用后臺校驗功能的開發參考。

      1.1. 背景

      在我們日常后臺的開發中,涉及到很多的字段驗證,一般普通的驗證框架就基本上可以滿足日常的開發需求,但有一些情況,這些普通的驗證框架無法達到要求,例如,我們必須對驗證的屬性進行分組,于是就產生了我們的Validator驗證框架。當然,我們的驗證框架不僅僅只提供了分組的功能。

      2. 參考文檔

      《Hibernate Validator - 5.1.0 - 英文版.pdf》

      3. 概覽

      3.1. 工作模式和配置模式

      Validator提供兩種工作模式:

      1、普通模式

      2、快速失敗返回模式

      默認的工作模式為快速失敗返回模式,一旦發現校驗失敗項,立即返回。普通模式在測試時期可以使用,可以對全部的校驗項進行完整的校驗(校驗組序列,以及基于校驗組序列的其他配置無效),通過修改配置文件中的校驗模式,從而實現工作模式的自由切換。開發人員無需關心其中的原理和過程。

       

      兩種配置模式:Annotation和Xml文件(此處略)。

      推薦使用Annotation注解模式。

      工作模式配置如下:

      validator.fail_fast:快速失敗返回模式(只要有一個驗證失敗,則返回異常)

      validator.normal:普通模式(會校驗完所有的屬性,然后返回所有的驗證失敗信息)

      3.2. 校驗功能

      Validator校驗框架按照Bean Validation的規范,使用了Hibernate Validatior框架。當前通過測試驗證的可以支持的功能有:

      1、內置注解校驗

      2、對象圖級聯校驗

      3、校驗組分組校驗

      4、校驗組序列

      5、自定義默認校驗組功能

      6、自定義智能默認校驗組功能

      7、自定義校驗注解

      8、類校驗——類屬性的關聯校驗

      此外,框架還內嵌了一些非法校驗的功能,比如輸入的校驗對象為null,或者指定的對象的屬性值錯誤,都會自行拋出異常。

      4. Validator的使用方法

      4.1. Validator的jar包

      目前,Validator的版本為2.0.0,后面可能會涉及到版本的更新。原始工程為Maven工程,使用的時候,只需要導入Validator依賴的pom文件以及進行簡單的配置即可。

      <dependency>

      <groupId>com.travelsky.common</groupId>

      <artifactId>validate</artifactId>

      <version>2.0.0</version>

      </dependency>

       

      4.2. Validator的配置文件

      配置文件可以從jar包里面獲取,使用的時候,直接加入類路徑下即可。附件部分給出了Validator依賴的pom文件。配置文件如下:

      <bean id="baseValidator" class="com.travelsky.common.validator.BaseValidator">

      <property name="validatorMode">

              <!-- 校驗器的工作模式:

      validator.fail_fast:快速失敗返回模式(只要有一個驗證失敗,則返回異常)

      validator.normal:普通模式(會校驗完所有的屬性,然后返回所有的驗證失敗信息)

              -->

      <value>validator.normal</value>

      </property>

      </bean>

       

      4.3. Validator接口

      使用Validator的校驗框架非常的簡單,只需要注入Validator接口即可:

      @Autowired

      private Validator validator;

       

      4.4. Validator中的方法

      Validator提供了6個校驗接口供開發人員使用:

      1、<T> void validate(T object) throws Exception

      用途:校驗一個對象的默認校驗組的屬性。

      2、<T> void validate(T object, Class<?>... groups) throws Exception

      用途:校驗一個對象的指定的一個或多個校驗組的屬性。

      3、<T> void validateProperty(T object, String propertyName) throws Exception

      用途:校驗一個對象的默認校驗組的一個指定的屬性值。

      4、<T> void validateProperty(T object, String propertyName, Class<?>... groups) throws Exception

      用途:校驗一個對象指定校驗組中的一個指定的屬性值。

      5、<T> void validateValue(Class<T> beanType, String propertyName, Object value) throws Exception

      用途:校驗一個value是否符合指定類的默認校驗組下的某一個屬性值。

      6、<T> void validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups) throws Exception

      用途:校驗一個value是否符合指定類的指定校驗組下的某一個屬性值。

      4.5. 測試類

      大家可以從工程源碼的測試目錄中,找到測試類,所有的測試類都可以正常運行,并加入了詳細的注釋說明。

      5. 各個校驗功能的開發指南

      本章節提供了各種校驗功能具體的開發方法,基本能夠滿足開發人員所有 的校驗需求。(所有的實體類省略了get和set方法)

      5.1. 內置注解校驗

      適用場景:簡單的單屬性的校驗。

      內置的校驗注解共分為三種:Bean Validation內置的校驗注解和Hibernate Validator拓展的校驗注解以及框架自帶的校驗注解。推薦大家首先考慮使用這些注解,簡單易用。

      使用方法:

      public class RangeModel {

      @Length(min=5, max=17)

      private String length;

       

      @Size(min=1, max=3)

      private String age;

       

      @Range(min=150,max=250)

      private int high;

       

      5.1.1. Bean Validator內置的注解

      Annotation

      支持的數據類型

      作用

      Hibernate metadata impact

      @AssertFalse

      Boolean, boolean

      判斷關聯屬性是否為布爾值false

      沒有

      @AssertTrue

      Boolean, boolean

      Checks that the annotated element istrue.

      沒有

      @DecimalMax

      BigDecimal, BigInteger, String, byte, short, int,long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type of Number.

      被注解的值必須不大于約束中指定的最大值. 這個約束的參數是一個通過BigDecimal定義的最大值的字符串表示.

      沒有

      @DecimalMin

      BigDecimal, BigInteger, String, byte, short, int,long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type of Number.

      被注解的值必須不小于約束中指定的最小值. 這個約束的參數是一個通過BigDecimal定義的最小值的字符串表示.

      沒有

      @Digits(integer=, fraction=)

      BigDecimal, BigInteger, String, byte, short, int,long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type of Number.

      校驗整數位數和小數位數

      對應的數據庫表字段會被設置精度(precision)和準度(scale).

      @Future

      java.util.Date, java.util.Calendar; Additionally supported by HV, if the Joda Time date/time API is on the class path: any implementations of ReadablePartial and ReadableInstant.

      檢查給定的日期是否比現在晚.

      沒有

      @Max

      BigDecimal, BigInteger, byte, short, int, longand the respective wrappers of the primitive types. Additionally supported by HV: String(the numeric value represented by a String is evaluated), any sub-type of Number.

      檢查該值是否小于或等于約束條件中指定的最大值.

      會給對應的數據庫表字段添加一個check的約束條件.

      @Min

      BigDecimal, BigInteger, byte, short, int, longand the respective wrappers of the primitive types. Additionally supported by HV: String(the numeric value represented by a String is evaluated), any sub-type of Number.

      檢查該值是否大于或等于約束條件中規定的最小值.

      會給對應的數據庫表字段添加一個check的約束條件.

      @NotNull

      Any type

      Checks that the annotated value is notnull.

      對應的表字段不允許為null.

      @Null

      Any type

      Checks that the annotated value is null.

      沒有

      @Past

      java.util.Date, java.util.Calendar; Additionally supported by HV, if the Joda Time date/time API is on the class path: any implementations of ReadablePartial and ReadableInstant.

      檢查注解對象中的值表示的日期比當前早.

      沒有

      @Pattern(regex=, flag=)

      String

      檢查該字符串是否能夠在match指定的情況下被regex定義的正則表達式匹配.

      沒有

      @Size(min=, max=)

      String, Collection, Map and arrays

      校驗對象的size。本文作者認為前提是該對象有size()方法,String除外。

      對應的數據庫表字段的長度會被設置成約束中定義的最大值.

      @Valid

      Any non-primitive type

      遞歸的對關聯對象進行校驗, 如果關聯對象是個集合或者數組, 那么對其中的元素進行遞歸校驗,如果是一個map,則對其中的值部分進行校驗.

      沒有

      5.1.2. Hibernate Validator拓展的注解

      Annotation

      支持的數據類型

      作用

      Hibernate metadata impact

      @CreditCardNumber

      String

      校驗信用卡號碼

      沒有

      @Email

      String

      校驗郵件地址

      沒有

      @Length(min=, max=)

      String

      功能同@Size,但是只支持String類型

      對應的數據庫表字段的長度會被設置成約束中定義的最大值.

      @NotBlank

      String

      不為null,不為空值,不為全空格。功能強大于@NotEmpty

      沒有

      @NotEmpty

      String,Collection,Map and arrays

      校驗是否為null或者為空值。功能強于@NotNull

      沒有

      @Range(min=, max=)

      BigDecimal,BigInteger,String, byte,short, int,long and the respective wrappers of the primitive types

      判斷數值的范圍,不僅支持數值類型,還支持字符串、字節等等類型

      沒有

      @SafeHtml(whitelistType=, additionalTags=)

      CharSequence

      無使用價值

      沒有

      @ScriptAssert(lang=, script=, alias=)

      Any type

      無使用價值

      沒有

      @URL(protocol=, host=, port=, regexp=, flags=)

      String

      Checks if the annotated string is a valid URL according to RFC2396. If any of the optional parameters protocol, host or port are specified, the corresponding URL fragments must match the specified values. The optional parametersregexp and flags allow to specify an additional regular expression (including regular expression flags) which the URL must match.

      沒有

      5.1.3. Validator框架拓展注解

      Annotation

      支持的數據類型

      作用

      @NotEmptyPattern

      String

      在字符串不為空的情況下,驗證是否匹配正則表達式

      @ListStringPattern

      List<String>

      驗證集合中的字符串是否滿足正則表達式

      @DateValidator

      String

      驗證日期格式是否滿足正則表達式,Local為ENGLISH

      @DateFormatCheckPattern

      String

      驗證日期格式是否滿足正則表達式,Local為自己手動指定

       

      5.2. 對象圖級聯校驗

      Validator不僅能夠校驗單個實例對象,還可以校驗完整的對象圖。對于實例中的對象成員屬性,注解上@Valid,就可以被關聯校驗。

      public class Order {

      @NotEmpty

      private String orderName;

      @NotNull

      @Valid

      private OrderItem orderItem;

      }

       

       

      public class OrderItem {

      @NotEmpty

      private String itemName;

      @NotEmpty

      @Pattern(regexp="\\d+")

      private String itemCode;

      @NotEmpty

      @Email

      private String email;

      }

       

      @RunWith(SpringJUnit4ClassRunner.class)

      @ContextConfiguration(locations = { "classpath:applicationContext-validator.xml" })

      public class CaseCadeTest {

      @Autowired

          private Validator validator;

       

      @Test

      public void test(){

      Order order = new Order();

      OrderItem item = new OrderItem();

      order.setOrderName("chuanhongliu");

      item.setEmail("12345");

      item.setItemCode("123456");

      item.setItemName("love");

      order.setOrderItem(item);

      try {

      validator.validate(order);

      } catch (ValidException e) {

      System.out.println(e.getAllMessage());

      }

      }

      }

       

       

      5.3. 校驗組分組校驗

      校驗組能夠在驗證的時候選擇應用哪些約束條件。校驗組是否通過可變參數傳遞給validate()、validateProperty()、validateValue()方法的,校驗的過程中,只有被指定的校驗組起作用。

      設置校驗組共分為三個步驟:

      1、創建校驗組接口:

      public interface AvailableFlightGroup {

       

      }

      public interface DestinationFlightGroup {

       

      }

       

      2、指定校驗組:

      public class SegmentVo {

      @NotNull

      @NotEmpty(groups={AvailableFlightGroup.class})

      private String deptCity;

      @Pattern(regexp="[A-Z]{3}", groups={DestinationFlightGroup.class})

      @NotEmpty(groups={DestinationFlightGroup.class})

      private String arrCity;

      @DateValidator(regexp="yyyyMMdd", message="日期格式不正確,正確的格式類似于19980413")

      @NotEmpty

      private String deptDate;

      @NotEmpty

      private String arrDate;

      @NotEmpty

      @Email

      private String email;

      }

       

      3、使用校驗組:

      @RunWith(SpringJUnit4ClassRunner.class)

      @ContextConfiguration(locations = { "classpath:applicationContext-validator.xml" })

      public class GroupTest {

       

          @Autowired

          private Validator validator;

          

          @Test

          public void test(){

           SegmentVo vo = new SegmentVo();

           vo.setDeptCity("PEK");

           vo.setArrCity("SH");

           vo.setDeptDate("20141026");

           vo.setArrDate("");

           try {

      validator.validate(vo,DestinationFlightGroup.class);

      validator.validate(vo,AvailableFlightGroup.class);

      } catch (ValidException e) {

      System.out.println(e.getMessage());

      System.out.println(e.getAllMessage());

      }

          }

          

          @Test

          public void test1(){

           SegmentVo vo = new SegmentVo();

           vo.setDeptCity("PEK");

           vo.setArrCity("SH");

           vo.setDeptDate("20141026");

           vo.setArrDate("");

           try {

           validator.validate(vo, DestinationFlightGroup.class, AvailableFlightGroup.class);

      } catch (ValidException e) {

      System.out.println(e.getMessage());

      System.out.println(e.getAllMessage());

      }

          }

      }

       

      注意:如果指定了校驗組,則該屬性將不再屬于默認的校驗組Default.class,則在省略校驗組參數的情況下,將不會校驗自定義校驗組的屬性。推薦大家重新自定義校驗組。可以參考自定義默認校驗組的功能。

      再注意:其實校驗組的接口可以不用專門定義,針對特定業務接口的校驗分組,可以直接指定特定的業務接口即可,這樣校驗分組就同業務接口做到了完整的統一。

      5.4. 校驗組序列

      可以按照指定的順序來逐個校驗各個校驗組。如果這個校驗組中有一個約束條件沒有通過的話,那么此約束條件后面的都不會再繼續被校驗。

      1、定義校驗組序列

      @GroupSequence({Default.class, AvailableFlightGroup.class, DestinationFlightGroup.class})

      public interface OrderChecks {

       

      }

       

      2、使用校驗組序列

      @RunWith(SpringJUnit4ClassRunner.class)

      @ContextConfiguration(locations = { "classpath:applicationContext-validator.xml" })

      public class OrderCheckTest {

      @Autowired

          private Validator validator;

       

      @Test

      public void test(){

      Flight flight = new Flight();

      flight.setDeptCity("PE");

      flight.setArrCity("");

      try {

      validator.validate(flight, OrderChecks.class);

      } catch (ValidException e) {

      System.out.println(e.getMessage());

      }

      }

       

      }

       

      5.5. 自定義默認校驗組功能

      由于一個對象的屬性指定了一個校驗組后,將不再屬于默認校驗組。如此一來,如果想要校驗全部的屬性值,那么將要注入默認校驗組和所有的自定義校驗組,使用起來非常的不方便。所以這里提供了自定義默認校驗組的功能。

      注意:自定義默認校驗組的時候,需要將類加入到@GroupSequence注解中。見紅色標注

      @GroupSequence({DefaultGroup.class,AvailableFlightGroup.class, DestinationFlightGroup.class})

      public class DefaultGroup {

      @NotEmpty(groups={DestinationFlightGroup.class})

      private String name;

      @Email(groups={AvailableFlightGroup.class})

      private String email;

      @AssertTrue

      private boolean man;

      }

       

      同校驗組序列相比,僅僅是將@GroupSequence注解直接打在了類上面。

      注意:因為不能在校驗組和校驗序列中有循環依賴的關系,所以,如果你想重定義一個類的默認組,并且還想把Default.class組加入到這個重定義的序列當中的話,則不能簡單的加入Default.class,而是需要把被重定義的類加入到其中。

      5.6. 自定義智能默認校驗組功能

      Hibernate Validator提供了非標準的@GroupSequenceProvider注解。本功能提供根據當前對象實例的狀態,來決定加載那些校驗組進入默認校驗組。

      1.定義GroupSequenceProvider:

      public class BMWGroupSequenceProvider implements DefaultGroupSequenceProvider<BMW> {

          @Override

          public List<Class<?>> getValidationGroups(BMW car) {

              List<Class<?>> defaultGroupSequence = new ArrayList<Class<?>>();

              defaultGroupSequence.add(BMW.class);

      //        defaultGroupSequence.add(Group2.class);

       

              if (car != null) {

                  defaultGroupSequence.add(Group2.class);

              }

              return defaultGroupSequence;

          }

      }

       

      2.注解自定義的GroupSequenceProvider:

      @GroupSequenceProvider(BMWGroupSequenceProvider.class)

      public class BMW extends Car{

          @NotNull

          @Valid

          private Driver driver;

          @Min(0)

          private int passager;

          @AssertFalse(groups = BMW.class)

          private boolean flag;

      }

       

      其中必須實現DefaultGroupSequenceProvider接口,同時可以根據被注入的對象的狀態或者當前屬性值來決定加載哪些校驗組。

      5.7. 自定義校驗注解

      先學習定義一個簡單的注解,而后定義一個支持多個屬性值和校驗組功能的注解。

      5.7.1. 定義一個簡單的注解

      開發人員可以自定義校驗注解,一方面可以實現邏輯比較復雜的校驗,另一方面也可以整合多個校驗注解。下面給出了一個自定義的校驗字符串大小寫的校驗規則,我們命名為CheckCase。

      1、定義枚舉類型

      public enum CaseMode {

          UPPER, 

          LOWER;

      }

       

      2、定義一個CheckCase的約束注解

      @Target({ METHOD, FIELD, ANNOTATION_TYPE })

      @Retention(RUNTIME)

      @Constraint(validatedBy = CheckCaseValidator.class)

      @Documented

      public @interface CheckCase {

       

          String message() default "自定義標注校驗失敗";

       

          Class<?>[] groups() default {};

       

          Class<? extends Payload>[] payload() default {};

       

          CaseMode value();

       

      }

       

      3、定義一個CheckCase的約束的驗證器

      public class CheckCaseValidator implements ConstraintValidator<CheckCase, String> {

       

          private CaseMode caseMode;

       

          public void initialize(CheckCase constraintAnnotation) {

              this.caseMode = constraintAnnotation.value();

          }

       

          public boolean isValid(String object, ConstraintValidatorContext constraintContext) {

           boolean isUpper = false;

              if (object == null)

                  return true;

              

              boolean isValid;

              if (caseMode == CaseMode.UPPER) {

                  isValid = object.equals(object.toUpperCase());

                  isUpper = true;

              }

              else {

                  isValid = object.equals(object.toLowerCase());

              }

              

              if(!isValid) {

                  constraintContext.disableDefaultConstraintViolation();

                  if (isUpper){

                   constraintContext.buildConstraintViolationWithTemplate("字符串必須為全大寫").addConstraintViolation();

                  }else{

                   constraintContext.buildConstraintViolationWithTemplate("字符串必須為全小寫").addConstraintViolation();

                  }

              }

              return isValid;

          }

       

      }

       

      4、使用自定義的CheckCase注解

      public class ConstraintbyselfModel {

      @CheckCase(value=CaseMode.UPPER)

      private String name;

       

      /**

       * @return the name

       */

      public String getName() {

      return name;

      }

       

      /**

       * @param name the name to set

       */

      public void setName(String name) {

      this.name = name;

      }

      }

       

       

      自定義Check Constraint的實質就是獲取注解的對象, 并對對象做一些邏輯上的解析,判斷是否符合校驗邏輯,并返回自定義的校驗信息。

      5.7.2. 定義一個高級的注解

      上面定義的CheckCase的標簽是一個比較簡單的標簽,下面定義一個可以設置多個屬性,并且支持分組功能的標簽。定義一個檢測List<String>中各個String是否滿足指定正則表達式的標簽ListStringPattern。

      1、定義一個約束注解ListStringPattern

      @Target({ METHOD, FIELD, ANNOTATION_TYPE })

      @Retention(RUNTIME)

      @Constraint(validatedBy = ListStringPatternValidator.class)

      @Documented

      public @interface ListStringPattern {

       

          String message() default "List<String>中的String不符合指定的正則表達式";

       

          Class<?>[] groups() default {};

       

          Class<? extends Payload>[] payload() default {};

       

          String regexp();

       

          /**

           * Defines several {@link ListStringPattern} annotations on the same element.

           * 

           * @see ListStringPattern

           */

          @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })

          @Retention(RUNTIME)

          @Documented

          @interface List {

       

              ListStringPattern[] value();

          }

       

      }

       

       

      其中里面所定義的屬性值,如groups、regex等等,都是可以在標簽中直接指定的,而@interface List內置標簽的作用是可以通知支持多個Annotation修飾同一個字段,例如:

      @ListStringPattern.List({@ListStringPattern(regexp="^liu"),@ListStringPattern(regexp="hong$")})

       

      2、定義約束ListStringPattern的約束校驗器

      public class ListStringPatternValidator implements ConstraintValidator<ListStringPattern, List<String>> {

       

          private String pattern;

       

          public void initialize(ListStringPattern constraintAnnotation) {

              this.pattern = constraintAnnotation.regexp();

          }

       

          public boolean isValid(List<String> list, ConstraintValidatorContext constraintContext) {

       

              if (list == null) {

                  return true;

              }

       

              String errorString = null;

              boolean isValid = true;

              if (pattern == null || "".equals(pattern.trim())) {

                  isValid = false;

                  if (!isValid) {

                      constraintContext.disableDefaultConstraintViolation();

                      constraintContext.buildConstraintViolationWithTemplate("指定的正則表達式為空").addConstraintViolation();

                  }

                  return isValid;

              } else {

                  Iterator<String> iter = list.iterator();

                  while(iter.hasNext()){

                      String string = iter.next();

                      if(!string.matches(pattern)){

                          isValid = false;

                          errorString = string;

                          break;

                      }

                  }

              }

       

              if (!isValid) {

                  constraintContext.disableDefaultConstraintViolation();

                  constraintContext.buildConstraintViolationWithTemplate("List<String>為空,或者其中的"+errorString+"不符合正則表達式:"+pattern).addConstraintViolation();

              }

              return isValid;

          }

       

       

      }

       

      3、ListStringPattern約束的使用方法

      @ListStringPattern(regex="[a-zA-Z]{1}")

      private List<String> list;

       

      5.8. 類校驗——類屬性的關聯校驗

      類級別的約束,本質上就是自定義校驗的約束注解。當一個約束被注解在類上的時候,這個類的實例對象被傳遞給ConstraintValidator。當需要同時校驗多個屬性或者一個屬性的校驗依賴于其他屬性虛信息的時候,類級別的校驗十分有用。下面提供一個校驗乘客數不能大約座位數的校驗用例,方法和過程同自定義約束注解。

      1、定義一個檢驗旅客數目合法性的注解

      @Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})

      @Retention(RetentionPolicy.RUNTIME)

      @Constraint(validatedBy={ValidPersonNumberValidator.class})

      @Documented

      public @interface ValidPersonNumber {

      String message()default "Person中的人數不合法!";

       

      Class<?>[] groups()default{};

       

      Class<? extends Payload>[] payload()default{};

      }

       

       

      2、定義一個驗證器

      public class ValidPersonNumberValidator implements ConstraintValidator<ValidPersonNumber, Person>{

       

      @Override

      public void initialize(ValidPersonNumber constraintAnnotation) {

       

      }

       

      @Override

      public boolean isValid(Person value, ConstraintValidatorContext context) {

      if(null == value){

      return true;

      }

      boolean isValid = value.getNumber()<=100;

      if(!isValid){

      context.disableDefaultConstraintViolation();

      context.buildConstraintViolationWithTemplate("Person類的總人不不能大于100").addConstraintViolation();

      }

      return isValid;

      }

       

      }

       

       

      3、使用方法

      @ValidPersonNumber

      public class Person {

      private int number;

       

      /**

       * @return the number

       */

      public int getNumber() {

      return number;

      }

       

      /**

       * @param number the number to set

       */

      public void setNumber(int number) {

      this.number = number;

      }

      }

       

      4、測試類

       

      @ValidPersonNumber

      @RunWith(SpringJUnit4ClassRunner.class)

      @ContextConfiguration(locations = { "classpath:applicationContext-validator.xml" })

      public class PersonTest {

      @Autowired

          private Validator validator;

       

      @Test

      public void test(){

      Person person = new Person();

      person.setNumber(110);

      try {

      validator.validate(person);

      } catch (ValidException e) {

      System.out.println(e.getMessage());

      }

      }

      }

       

      5.9. 約束條件組合校驗

      在某些復雜的場景中, 可能還會有更多的約束條件被定義到同一個元素上面, 這可能會讓代碼看起來有些復雜, 另外, 如果在另外的類里面還有一個相同的屬性, 我們可能還要把這些約束條件再拷貝到這個屬性上, 但是這樣做又違反了 DRY 原則.這個問題可以通過使用組合約束條件來解決.

      1、定義一個約束條件組合的注解

      @NotNull

      @NotBlank

      @Target( { ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE })

      @Retention(RetentionPolicy.RUNTIME)

      @Constraint(validatedBy = {})

      @Documented

      public @interface NotNullAndValidCheck {

      String message() default "必須不為null且屬性格式符合要求";

       

          Class<?>[] groups() default {};

       

          Class<? extends Payload>[] payload() default {};

      }

      2、約束條件組合注解的使用

      public class Order1 {

      @NotEmpty

      private String orderName;

      @NotNullAndValidCheck

      private OrderItem orderItem;

       

      3、測試類

      @RunWith(SpringJUnit4ClassRunner.class)

      @ContextConfiguration(locations = { "classpath:applicationContext-validator.xml" })

      public class NotNullAndValidCheckTest {

      @Autowired

          private Validator validator;

       

      @Test

      public void test(){

      Order1 order = new Order1();

      order.setOrderName("chuanhongliu");

      try {

      validator.validate(order);

      } catch (ValidException e) {

      System.out.println(e.getMessage());

      }

      }

      }

      6. 各個功能的使用場景

      本章主要供大家認識各個校驗功能的適用場景,大家根據這些適用場景并結合自己的具體需求,來整合多種校驗功能,確定自己的開發策略。

      6.1. 內置注解校驗

      本框架主要是通過打注解(注解)的方式去校驗Bean中的屬性,現成可用的注解有Bean Validator內置的注解和Hibernate Validator拓展的注解以及Validator自帶的注解三種,可以直接使用。父類的校驗配置會自動被子類繼承。

      適用場景:簡單的單屬性校驗。

      6.2. 對象圖級聯校驗

      對于一個對象中的成員對象屬性,打上@Valid注解后,會自動實現對成員對象的級聯校驗。

      本功能適用于復雜的對象,其成員屬性為一個對象。

      6.3. 校驗組分組校驗

      可以對不同的屬性進行分組,以便在特定場景下,僅僅校驗一個或幾個校驗組。一個屬性可以歸屬為多個校驗組。

      適用場景:將需要校驗的屬性分類,并單獨按組校驗。

      6.4. 校驗組序列

      對于已經分成多個校驗組的對象,可以配置校驗組序列,讓各個校驗組按照一定的順序來進行校驗。

      適用場景:校驗組的順序校驗。

      6.5. 自定義默認校驗組

      一個對象會有一個默認的校驗組,包含了所有的未分組的校驗項。校驗默認組的時候不需要在校驗方法中指明校驗組。如果想讓默認校驗組包含所有的分組的校驗項,可以使用自定義的默認校驗組。這樣如果想校驗整個的對象,就不需要再方法中指定校驗組了。大大提高了使用的便利性。推薦所有劃分校驗組的對象都重新自定義默認校驗組。

      適用場景:有校驗組的情況下,重新定義默認校驗組,以包含所有的校驗項。

      6.6. 自定義智能默認校驗組

      對于自定義的默認校驗組,會有很多的校驗組組成。如果想根據當前對象的不同狀態來確定默認校驗組的組成,決定到底去校驗哪些校驗組,可以自定義智能默認校驗組。

      適用場景:根據對象的不同狀態,來決定校驗哪些校驗組。

      6.7. 自定義校驗注解

      對于某一個屬性有多重校驗約束,或者一些邏輯上的校驗約束,可以自定義校驗注解,以便整合多重校驗約束,或者提供復雜邏輯的校驗約束。

      適用場景:針對某一個屬性值的復雜的校驗邏輯,需要自定義。

      6.8. 類校驗-類屬性關聯校驗

      對類校驗,注解打在類名上。并可以判斷對象中多個屬性值之間是否滿足某種業務邏輯,來判斷是否通過校驗。

      適用場景:對象多個屬性值的關聯校驗。

      7. 附件

      7.1. 依賴的pom文件

      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

        <modelVersion>4.0.0</modelVersion>

       

        <groupId>com.travelsky.common</groupId>

        <artifactId>validate</artifactId>

        <version>2.0.0</version>

        <packaging>jar</packaging>

       

        <name>validate</name>

        <url>http://maven.apache.org</url>

       

        <properties>

          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

          <spring-version>3.2.5.RELEASE</spring-version>

          <junit.version>4.10</junit.version>

        </properties>

       

        <dependencies>

         <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-test</artifactId>

      <version>${spring-version}</version>

      <scope>test</scope>

      </dependency>

      <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-beans</artifactId>

      <version>${spring-version}</version>

      </dependency>

      <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-core</artifactId>

      <version>${spring-version}</version>

      </dependency>

      <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-context</artifactId>

      <version>${spring-version}</version>

      </dependency>

           <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>${junit.version}</version>

      <scope>test</scope>

      </dependency>

      <dependency>

      <groupId>commons-logging</groupId>

      <artifactId>commons-logging</artifactId>

      <version>1.1.1</version>

      </dependency>

      <dependency>

      <groupId>org.apache.commons</groupId>

      <artifactId>commons-lang3</artifactId>

      <version>3.1</version>

      </dependency>

      <dependency>

            <groupId>org.hibernate</groupId>

            <artifactId>hibernate-validator</artifactId>

            <version>5.1.0.Final</version>

          </dependency>

          <dependency>

            <groupId>javax.el</groupId>

            <artifactId>el-api</artifactId>

            <version>2.2.1-b04</version>

          </dependency>

          <dependency>

            <groupId>com.sun.el</groupId>

            <artifactId>el-ri</artifactId>

            <version>1.0</version>

          </dependency>

          <dependency>

            <groupId>javax.validation</groupId>

            <artifactId>validation-api</artifactId>

            <version>1.1.0.Final</version>

          </dependency>

          <dependency>

      <groupId>com.fasterxml</groupId>

      <artifactId>classmate</artifactId>

      <version>0.5.4</version>

      </dependency>

        </dependencies>

      </project>

       

      注意:具體的jar包視工程類型而定,例如,如果你只是一個普通的java項目,則需要加入el包,如果是在容器中運行的項目,例如JBOSS AS,則不需要引入此包,因為該容器已經提供了這個jar包

      7.2. Validator校驗錯誤碼

      錯誤碼

      錯誤信息

      20141031

      validate功能校驗對象不可為空!

      20141032

      校驗的對象沒有該屬性

      20141033

      校驗失敗!

      20141034

      校驗的對象不合法!

      20141035

      校驗的屬性值不合法!

      20141036

      校驗的輸入值不合法!

      說明:開發人員可以根據返回的錯誤碼,進行進一步的處理。

       
      posted @ 2024-07-12 19:34  奔跑de陀螺  閱讀(968)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 97超级碰碰碰碰久久久久| 亚洲高清日韩专区精品| 综合偷自拍亚洲乱中文字幕| 大屁股肥熟女流白浆| 亚洲男人的天堂网站| 久久精品一本到99热免费| 国产亚洲精品久久777777| 伊人久久大香线蕉av色婷婷色| 在线亚洲妇色中文色综合| 亚洲人成电影网站色mp4| 98日韩精品人妻一二区| 好吊妞| 亚洲人成网站18禁止无码| 激情综合网激情五月伊人| 在线观看视频一区二区三区| 亚洲男人AV天堂午夜在| 精品国产自在久久现线拍| 亚洲综合一区二区三区不卡| 亚洲欧洲精品日韩av| 成年女人永久免费观看视频| 亚洲精品成人无限看| 久久夜色国产噜噜亚洲av| 伊人久久大香线蕉网av| 国产精品不卡区一区二| 狠狠色狠狠色综合日日不卡| 久草热在线视频免费播放| 熟妇人妻av无码一区二区三区| 国产精品成| 国产卡一卡二卡三免费入口| 国产又爽又大又黄a片| 久久国产精品第一区二区| 日本一道本高清一区二区| 当雄县| 国产精品一区二区久久岳| 2019久久久高清日本道| 亚洲成在人线在线播放无码| 中国少妇人妻xxxxx| 精品国产一区二区三区大| 亚洲中文字幕人妻系列| 亚洲中文字幕日产无码成人片| 熟妇人妻一区二区三区四区|