我成功使用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)
」。