Использование пользовательского ResourceBundle с Hibernate Validator

StackOverflow https://stackoverflow.com/questions/4258314

Вопрос

Я пытаюсь настроить пользовательский источник сообщения для 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.

  1. Сначала в пользовательских задачах (который является рекурсивным),
  2. Затем в 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top