Валидатор гибернации, пользовательский ResourceBundleLocator и Spring - PullRequest
9 голосов
/ 15 ноября 2010

Я пытаюсь переопределить ResourceBundleLocator по умолчанию при проверке гибернации 4.1.Пока он работает отлично, но единственными примерами его использования является Java-код для создания экземпляра ValidationFactory.

При использовании веб-приложения с пружинной проверкой гибернации автоматически настраивается (должен существовать только подходящий файл проверки гибернации * .jarи он автоматически используется).Как я могу заменить ResourceBundleLocator в этом сценарии?Я не вижу способа указать свой собственный ResourceBundleLocator в каких-либо свойствах или файле applicationContext.xml.

Ответы [ 3 ]

18 голосов
/ 22 ноября 2010

Волшебный метод, который выполняет требуемую работу: LocalValidatorFactoryBean # setValidationMessageSource (MessageSource messageSource) .

Прежде всего, контракт метода: -

Укажите настраиваемый источник сообщений Spring для разрешения проверки сообщения, а не полагаться на JSR-303 по умолчанию Пакет "ValidationMessages.properties" в пути к классам. Это может относиться к Общий контекст весны bean-компонент messageSource или некоторым специальная настройка MessageSource для только для проверки.

ПРИМЕЧАНИЕ. Для использования этой функции требуется режим гибернации. Валидатор 4.1 или выше на CLASSPATH. Тем не менее, вы можете использовать другой поставщик проверки, но Спящий Валидатор ResourceBundleMessageInterpolator класс должен быть доступен во время конфигурации.

Укажите либо это свойство, либо "messageInterpolator", а не оба. Если Вы хотели бы создать кастом MessageInterpolator, рассмотрите возможность получения из спящего валидатора ResourceBundleMessageInterpolator и проходя весной MessageSourceResourceBundleLocator при построении вашего интерполятора.

Вы можете указать свои собственные свойства message.properties (или .xml), вызвав этот метод ... вот так ...

мой-beans.xml

<bean name="validator"
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="validationMessageSource">
        <ref bean="resourceBundleLocator"/>
    </property>
</bean>

<bean name="resourceBundleLocator" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basenames">
        <list>
            <value>META-INF/validation_errors</value>
        </list>
    </property>
</bean>

validation_errors.properties

javax.validation.constraints.NotNull.message=MyNotNullMessage

Person.java

    class Person {
    private String firstName;
    private String lastName;

    @NotNull
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

BeanValidationTest.java

    public class BeanValidationTest {

    private static ApplicationContext applicationContext; 

    @BeforeClass
    public static void initialize() {
        applicationContext = new ClassPathXmlApplicationContext("classpath:META-INF/spring/webmvc-beans.xml");
        Assert.assertNotNull(applicationContext);
    }

    @Test
    public void test() {
        LocalValidatorFactoryBean factory = applicationContext.getBean("validator", LocalValidatorFactoryBean.class);
        Validator validator = factory.getValidator();
        Person person = new Person();
        person.setLastName("dude");
        Set<ConstraintViolation<Person>> violations = validator.validate(person);
        for(ConstraintViolation<Person> violation : violations) {
            System.out.println("Custom Message:- " + violation.getMessage());
        }
    }

}

Outupt: Custom Message:- MyNotNullMessage

5 голосов
/ 26 марта 2014

Вот решение, если вы хотите смешать существующие сообщения проверки гибернации и пользовательские сообщения проверки:

<mvc:annotation-driven validator="validator" />
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="validationMessageSource" ref="messageSource"/>
</bean>
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames" value="i18n,iso-i18n,org.hibernate.validator.ValidationMessages" />
    <property name="useCodeAsDefaultMessage" value="true" />
</bean>

(см. Раздел валидации Web MVC Framework и Поставщик проверки бина в документации Spring)

1 голос
/ 31 июля 2018

Спасибо @ Lu55, основываясь на твоем ответе, я решил свою проблему !!

Я только что перешел в класс Configuration, и я публикую здесь на всякий случай, если кому-то еще понадобится:

Детали импорта: у меня это работало с ReloadableResourceBundleMessageSource, но не работало с ResourceBundleMessageSource.Я не уверен, почему.

@Configuration
public class ErrorConfig {

    @Bean
    public Validator validatorFactory (MessageSource messageSource) {
        LocalValidatorFactoryBean validator =  new LocalValidatorFactoryBean();
        validator.setValidationMessageSource(messageSource);
        return validator;
    }

    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource bean = new ReloadableResourceBundleMessageSource();
        bean.addBasenames("classpath:org.hibernate.validator.ValidationMessages","classpath:message");
        bean.setDefaultEncoding("UTF-8");
        return bean;
    }
}

Внутри моей папки ресурсов у меня есть файл message.properties.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...