9

Hibernate検証4.1でデフォルトのResourceBundleLocatorをオーバーライドしようとしています。これまでのところ完全に機能しますが、その使用例としては、ValidationFactoryをインスタンス化するJavaコードのみがあります。

Spring Hibernate検証でWebアプリケーションを使用する場合、自動的に構成されます(適切なHibernate検証* .jarファイルのみが存在する必要があり、自動的に使用されます)。そのシナリオでResourceBundleLocatorを置き換えるにはどうすればよいですか?プロパティまたはapplicationContext.xmlファイルにカスタムResourceBundleLocatorを指定する方法がありません。

4

3 に答える 3

19

必要なジョブを実行する魔法のメソッドは、LocalValidatorFactoryBean#setValidationMessageSource(MessageSource messageSource)です。

まず第一に、メソッドの契約:-

クラスパス内のJSR-303のデフォルトの「ValidationMessages.properties」バンドルに依存する代わりに、検証メッセージを解決するためのカスタムSpringMessageSourceを指定します。これは、Springコンテキストの共有「messageSource」Bean、または検証目的でのみ使用される特別なMessageSourceセットアップを参照する場合があります。

注:この機能には、クラスパスにHibernateValidator4.1以降が必要です。それでも、別の検証プロバイダーを使用することはできますが、構成中にHibernateValidatorのResourceBundleMessageInterpolatorクラスにアクセスできる必要があります。

このプロパティまたは「messageInterpolator」のいずれかを指定します。両方を指定することはできません。カスタムMessageInterpolatorを構築する場合は、Hibernate ValidatorのResourceBundleMessageInterpolatorから派生し、補間器を構築するときにSpringMessageSourceResourceBundleLocatorを渡すことを検討してください。

このメソッドを呼び出すことにより、カスタムmessage.properties(または.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>

validate_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

于 2010-11-22T16:13:44.863 に答える
5

既存の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>

(Springのドキュメントの「 WebMVCフレームワークの検証」セクション「Bean検証プロバイダーの構成」を参照してください)

于 2014-03-26T08:33:12.527 に答える
1

ありがとう@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ファイルがあります。

于 2018-07-31T10:01:06.820 に答える