8

まず、Spring MVC 3.1.1 と Hibernate validation 4.2.0 を使用していることを説明させてください。Spring アプリケーションのさまざまなフォームに検証アノテーションを使用しています。アプリケーションをローカライズする必要があるため、検証メッセージに次のようなリソース バンドルを使用しています。

# ValidationMessages.bundle
FieldMatch=Password and confirmation must match.

このメッセージに対応するクラス定義は次のようになります。

@FieldMatch.List({
    @FieldMatch(first = "password", second = "passwordConfirmation")
})
public class RegistrationForm {
    // ...
}

このカスタム リソース バンドルを appContext.xml に設定しましたが、メッセージは問題なくフォームに表示されています。

ただし、ここに私のジレンマがあります。より多くのフィールドが一致することを確認する必要があるという新しい要件があります。現在、2 つのパスワード フィールドが一致していることを確認しています。私の要件は、メールアドレスも確認する必要があるということです。これがばかげた要件であることはわかっていますが、変更することはできません。したがって、クラス定義は次のようになります。

@FieldMatch.List({
    @FieldMatch(first = "password", second = "passwordConfirmation")
    @FieldMatch(first = "email", second = "emailConfirmation")
})
public class RegistrationForm {
    // ...
}

明らかに、現在のリソース バンドルは機能しません。これは、2 つの個別のメッセージ (一致ごとに 1 つ) が必要だからです。リソースバンドルでそのメッセージを使用して定義しようとしましmessage="{emails.must.match}"たが、実際にはメッセージが表示されることはなく、実際のテキストが表示されるだけです{email.must.match}

以上の説明の後、私の質問は単純です。FieldMatchクラス レベルのこれらのバリデーターのそれぞれに、リソース バンドルで定義された異なるメッセージを持たせ、ローカライズできるようにするにはどうすればよいでしょうか?

助けてくれてありがとう!

[編集] 好奇心旺盛な人のために、これFieldMatch私が使用しているバリデーターです。

2012 年 5 月 23 日更新 他の人が求めた Bean 定義は次のとおりです。

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames">
        <list>
            <value>ErrorBundle</value>
            <value>ForgotPasswordBundle</value>
            <!-- etc etc -->
        </list>
    </property>
</bean>

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

3 に答える 3

1

FieldMatch はjavax.validation.Validator、Spring バリデータ ( ) ではなく、 JSR-303 バリデータ ( ) を使用していorg.springframework.validation.Validatorます。次のようにメッセージ ソースを設定しましたか。

<!-- JSR-303 -->
<bean id="validator"
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="validationMessageSource" ref="messageSource"/>
</bean>

もちろん、対応するmessageSource?

于 2012-05-17T12:06:19.493 に答える
1

このようなケースでは、通常、OP が質問に含めていないものをオンにします。これは、解決策が単純であるか、OPが原因であると考えていたことが原因である場合、問題が発生しないためだと思います。判断はありません。やりました。

したがって、完全な解決策ではなく、トラブルシューティングの手順を提示します。これは、あなたが言ったことに基づいて、うまくいくはずだからです.

まず、奇妙な補間の問題ではないことを再確認して、 を試してみましょうmessage="{emails-must-match}"

それが機能しない場合は、以前は ValidationMessages.properties が機能していたようです。私はそれに戻って(バリデータ構成から削除して) 、ValidationMessages.propertiesで定義されたもの<property name="validationMessageSource" ref="messageSource"/>を使用できるかどうかを確認します。それでも問題が解決しない場合は、キーを使用したデフォルトのメッセージに戻り、両方のエラー条件でそのメッセージが表示されるかどうかを確認してください。message="{emails.must.match}"emails.must.matchFieldMatch

これは、問題を特定するのに役立ちます。

于 2012-05-24T21:51:13.487 に答える
0

リソース バンドル内のメッセージのキーは何ですか? messageこれは "emails.must.match" である必要があります (つまり、制約の属性に必要な中括弧なし)。

于 2012-05-01T21:26:57.187 に答える