Использование пользовательского ResourceBundle с Hibernate Validator
-
27-09-2019 - |
Вопрос
Я пытаюсь настроить пользовательский источник сообщения для Hibernate Validator 4.1 через пружину 3.0. Я настроил необходимую конфигурацию:
<!-- JSR-303 -->
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="validationMessageSource" ref="messageSource"/>
</bean>
Переводы подаются из моего источника сообщений, но кажется, что замена токенов в самих сообщений выглядят в источнике сообщения, т. Е. Для A:
my.message=the property {prop} is invalid
Есть призывы смотреть «опоры» в сообщениях. Идти в ResourceBundleMessageInterpolator.interpolateMessage
Я отмечаю, что Javadoc утверждает:
Запускает интерполяцию сообщения в соответствии с алгоритмом, указанным в JSR 303.
ПРИМЕЧАНИЕ: поиск в пакетах пользователей является рекурсивным, тогда как поиск в пучке по умолчанию нет!
Это похоже на то, что рекурсия всегда будет иметь место для указанного пользователем связке, поэтому, в случае, если я не могу перевести стандартные сообщения, такие как один для размера.
Как я могу подключить свой собственный источник сообщений и иметь возможность заменяться параметры в сообщении?
Решение
Это похоже на то, что рекурсия всегда будет иметь место для указанного пользователем связке, поэтому, в случае, если я не могу перевести стандартные сообщения, такие как один для размера.
Hibernate Validator ResourceBundleMessageInterPolator Создать два экземпляра ResourceBundLeLocator (т.е. платформуResourceBundlecator), один для пользовательских сообщений проверки - USERRESOURCEBUNDLELOCATOR и другой для сообщений jsr-303 стандартных сообщений.
Любой текст, который появляется в течение двух фигурных скобок, например, {someText}
В сообщении рассматривается как замена. ResourceBundLemessageInterPolator пытается найти соответствующую стоимость, которое может заменить замену в RescountBunnleCors.
- Сначала в пользовательских задачах (который является рекурсивным),
- Затем в DelumbersvalidationMessages (что не рекурсивно).
Итак, если вы поместите стандартное сообщение JSR-303 в пользовательском ResourceBundle, скажем, validation_erros.properties
, Это будет заменено вашим пользовательским сообщением. Увидеть в этом ПРИМЕР Стандартное ненужное подтверждение сообщения «Может не быть NULL» было заменено пользовательским сообщением «MynotnullMessage».
Как я могу подключить свой собственный источник сообщений и иметь возможность заменяться параметры в сообщении?
my.message = Имущество {PROP} недействительна
После прохождения как ресурсовBundLeCators, ResourceBundlemessageInterPolator находит для более реснитеших в резинометрике (разрешено как оба пакета). Эти заместители - это не что иное, как имена атрибутов аннотации, если такие ретрансплатекены находятся в резистентной платеже, они заменяются Значения соответствующих атрибутов аннотации.
ResourceBundLemessageInterPolator.java [Line 168, 4.1.0.final
resolvedMessage = replaceAnnotationAttributes( resolvedMessage, annotationParameters );
Предоставление примера для замены {PROP} с пользовательским значением, я надеюсь, что это поможет вам ....
Mynotnull.java
@Constraint(validatedBy = {MyNotNullValidator.class})
public @interface MyNotNull {
String propertyName(); //Annotation Attribute Name
String message() default "{myNotNull}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default {};
}
Mynotnullvalidator.java
public class MyNotNullValidator implements ConstraintValidator<MyNotNull, Object> {
public void initialize(MyNotNull parameters) {
}
public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
return object != null;
}
}
User.java.
class User {
private String userName;
/* whatever name you provide as propertyName will replace {propertyName} in resource bundle */
// Annotation Attribute Value
@MyNotNull(propertyName="userName")
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
Validation_Errors.Properties.
notNull={propertyName} cannot be null
Контрольная работа
public void test() {
LocalValidatorFactoryBean factory = applicationContext.getBean("validator", LocalValidatorFactoryBean.class);
Validator validator = factory.getValidator();
User user = new User("James", "Bond");
user.setUserName(null);
Set<ConstraintViolation<User>> violations = validator.validate(user);
for(ConstraintViolation<User> violation : violations) {
System.out.println("Custom Message:- " + violation.getMessage());
}
}
Выход
Custom Message:- userName cannot be null