Hibernate Validatorを使用したカスタムリソースバントルを使用します
-
27-09-2019 - |
質問
Hibernate Validator 4.1からSpring 3.0のカスタムメッセージソースを設定しようとしています。必要な構成を設定しました:
<!-- JSR-303 -->
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="validationMessageSource" ref="messageSource"/>
</bean>
翻訳は私のメッセージソースから提供されますが、メッセージ自体の交換トークンはメッセージソースで見上げられているようです。
my.message=the property {prop} is invalid
MessagesSourceで「プロップ」を調べるための呼び出しがあります。入ります ResourceBundleMessageInterpolator.interpolateMessage
Javadocは次のように述べています。
JSR 303で指定されたアルゴリズムに従って、メッセージ補間を実行します。
注:ユーザーバンドルのルックアップは再帰的ですが、デフォルトのバンドルのルックアップはそうではありません!
これは、ユーザーが指定したバンドルのために常に再帰が行われるように見えますので、実際にはサイズのような標準メッセージを翻訳することはできません。
自分のメッセージソースをプラグインして、メッセージにパラメーターを置き換えるにはどうすればよいですか?
解決
これは、ユーザーが指定したバンドルのために常に再帰が行われるように見えますので、実際にはサイズのような標準メッセージを翻訳することはできません。
Hibernate ValidatorのResourceBundleMessageInterPolatorユーザー定義の検証メッセージ用のResourceBundleLeLocator(IE PlatformResourceBundleLeLocator)の2つのインスタンスを作成します。
2つの巻き毛の中に表示されるテキストなど {someText}
メッセージは、交換用の扱いとして扱われます。 ResourceBundLemessageInterPolatorは、ResourceBundleLeLocatorsの交換用Tokenを置き換えることができる一致する値を見つけようとします。
- 最初にuserdefinedValidationMessages(これは再帰的です)で、
- 次に、DefaultValidationMessages(再帰ではありません)で。
したがって、標準のJSR-303メッセージをカスタムResourceBundleに配置すると、 validation_erros.properties
, 、カスタムメッセージに置き換えられます。これを参照してください 例 標準NotNull検証メッセージ「Not Not null」は、カスタム「mynotnullmessage」メッセージに置き換えられました。
自分のメッセージソースをプラグインして、メッセージにパラメーターを置き換えるにはどうすればよいですか?
my.message =プロパティ{prop}は無効です
両方のResourceBundleLeLocatorsを通過した後、ResourceBundleMessageInterPolatorは、ResolvedMessage(両方のバンドルで解決された)でより多くの交換が行われることを発見します。これらの交換は、それに他なりません 注釈の属性の名前, 、そのような交換がsolowvedMessageで見つかった場合、それらはに置き換えられます 一致する注釈属性の値.
ResourceBundleMessageInterPolator.java [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