2017-07-12 35 views
0

我成功使用Hibernate驗證器驗證請求POJO。 getter上的註釋有些自我記錄,所以有人可以仔細閱讀生成的javadoc,看看約束是什麼。如何從約束描述符手動評估hibernate驗證器消息模板?

我覺得這對於有效的文檔來說還不夠好。我試圖編寫一個Javadoc自定義Taglet,它反省了當前包含的類,併爲該類中的屬性構建了一個約束HTML表格。

我實際上已經能夠爲每個約束屬性獲取ConstraintDescriptor。我想要做的是插入「messageTemplate」來產生可讀的字符串。例如,如果某個屬性具有@Size批註,則可以找到關於此ConstraintDescriptor的信息,而「messageTemplate」屬性的值爲「{javax.validation.constraints.Size.message} 」。我需要得到的信息是「必須在X和Y之間」(或類似的東西)。如果該字符串具有指定的實際「最小」和「最大」值,但如果它說「必須介於{min}和{max}之間......」,那將是非常好的。

似乎接近的唯一東西就是ValidatorFactory的「messageInterpolator」屬性和它的「interpolate()」方法。問題是,除了消息模板之外,該方法還需要一個「Context」對象。這當然是可以理解的,因爲它必須從類似這樣的東西中得到像「min」和「max」這樣的參數,但我不明白我必須在這裏提供什麼。

到目前爲止我的代碼看起來有點像這樣:

  ValidatorFactory validatorFactory = 
       Validation. 
       byProvider(HibernateValidator.class). 
       providerResolver(new HibernateValidatorProviderResolver()). 
       configure(). 
       externalClassLoader(getClass().getClassLoader()). 
       messageInterpolator(new ResourceBundleMessageInterpolator(
         new PlatformResourceBundleLocator(ResourceBundleMessageInterpolator.USER_VALIDATION_MESSAGES), 
         true, buildExpressionFactory())). 
       buildValidatorFactory(); 

     Validator validator = validatorFactory.getValidator(); 

     BeanDescriptor constraintsForClass = validator.getConstraintsForClass(clazz); 
     System.out.println("constraintsForClass[" + constraintsForClass + 
          "] hasConstraints[" + constraintsForClass.hasConstraints() + "]"); 
     if (constraintsForClass.hasConstraints()) { 
      for (ConstraintDescriptor<?> constraintDescriptor : constraintsForClass.getConstraintDescriptors()) { 
       System.out.println("constraintDescriptor[" + constraintDescriptor + "]"); 
       emitTableRow(sb, "", constraintDescriptor); 
      } 
     } 
     for (PropertyDescriptor propertyDescriptor : constraintsForClass.getConstrainedProperties()) { 
      System.out.println("propertyDescriptor[" + propertyDescriptor + 
           "] name[" + propertyDescriptor.getPropertyName() + "]"); 
      for (ConstraintDescriptor<?> constraintDescriptor : propertyDescriptor.getConstraintDescriptors()) { 
       System.out.println("constraintDescriptor[" + constraintDescriptor + 
            "] mt[" + constraintDescriptor.getMessageTemplate() + "]"); 
       String interpolatedStr = validatorFactory.getMessageInterpolator().interpolate(constraintDescriptor.getMessageTemplate(), null); 
       System.out.println("interpolatedStr[" + interpolatedStr + "]"); 

正如你所看到的,我目前通過「零」作爲第二個參數爲「內插()」,這將導致在NPE 「org.hibernate.validator.internal.engine.messageinterpolation.ParameterTermResolver.getVariable(Context, String)」。

回答

0

您可以嘗試並傳入MessageInterpolator.Context的虛擬實現,它將返回您手中的描述符,併爲驗證值返回null。