Hibernate Validator、Custom ResourceBundlelocatorおよびSpring
-
10-10-2019 - |
質問
冬眠検証4.1でデフォルトのResourceBundLeLocatorをオーバーライドしようとしています。これまでのところ完全に機能していますが、その使用の唯一の例には、validationFactoryをインスタンス化するJavaコードが含まれます。
Spring Hibernate検証を使用してWebアプリケーションを使用する場合、自動的に構成されています(適切なHibernate検証 *のみが存在する必要があり、自動的に使用されます)。そのシナリオでResourceBundleLocatorを代用するにはどうすればよいですか?プロパティまたはApplicationContext.xmlファイルにカスタムResourceBundLeLocatorを特定する方法はありません。
解決
必要なジョブを行う魔法の方法はです LocalValidatorFactoryBean.
まず第一に、メソッドの契約: -
JSR-303のデフォルトの「validationmessages.properties」バンドルに依存するのではなく、検証メッセージを解決するためのカスタムスプリングメッセージソースを指定します。これは、Spring Contextの共有された「Messagesource」Beanを指し、検証目的でのみ特別なメッセージソースセットアップを指す場合があります。
注:この機能には、ClassPathのHibernate Validator 4.1以降が必要です。それにもかかわらず、別の検証プロバイダーを使用することもできますが、Hibernate ValidatorのResourceBundleMessageInterPolatorクラスは、構成中にアクセスできる必要があります。
両方ではなく、このプロパティまたは「messageinterpolator」のいずれかを指定します。カスタムMessageInterPolatorを構築する場合は、Hibernate ValidatorのResourceBundleMessageInterPolatorから派生し、インタープロレーターを構築するときにSpring MessagasouresourceBundlelocatorを渡すことを検討してください。
この方法を呼び出すことで、カスタムメッセージを指定できます。
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>
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());
}
}
}
アウトプト: 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フレームワーク検証セクション と Bean検証プロバイダーの構成 春のドキュメントで)
ありがとう @lu55、あなたの答えに基づいて私は私の問題を解決しました!!
構成クラスに変換したばかりで、他の誰かが必要な場合に備えてここに投稿しています。
インポートの詳細: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ファイルがあります。