Wibernate vedumator, пользовательский ресурсбундлелокатор и пружина

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

Вопрос

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

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

Это было полезно?

Решение

Магический метод, который выполняет необходимую работу, является LocalValidatorFactoryBean#setValidationMessagesource (MessageSource Speakyource).

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

Укажите пользовательский Spring MessageSource для разрешения валидационных сообщений, вместо того, чтобы полагаться на комплект JSR-303 по умолчанию. Это может относиться к общему контексту «Сообщений» для весеннего контекста или на некоторую специальную настройку сообщений только для целей валидации.

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

Укажите это свойство или «MessageInterpolator», а не оба. Если вы хотите построить пользовательский интерфейс MessageInterpolator, рассмотрите возможность получения из ресурса Hibernate Validator ResourceBundlemessageInterpolator и пропустить в Spring MessageSourcerSourceBundleLocator при построении вашего интерполятора.

Вы можете указать свое пользовательское сообщение. Прозрачные (или .xml), вызывая этот метод ...

my-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>

valyation_errors.properties

javax.validation.constraints.NotNull.message=MyNotNullMessage

Человек. Ява

    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

Другие советы

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

<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 а также Настройка поставщика проверки бобов В весенней документации)

Спасибо @lu55, исходя из вашего ответа, я решил свою проблему !!

Я только что преобразовал в класс конфигурации, и я публикую здесь на случай, если кто -то еще нуждается:

Детали импорта: это сработало для меня с ReloadalerSourceBundlemessagesource, но не работало с использованием 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;
    }
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top