web-dev-qa-db-ja.com

一部のロケールでSpring MessageSource引数が正しく入力されないのはなぜですか?

mailconfirm.mail.body=<html><body><h3 style="margin: 0 0 1em;">Hi, {0}!</h3>\
    To confirm your email address click on the confirmation link given bellow. If clicking on the link doesn't work, copy and paste the link in a new browser tab. <br /><br />\
    <a href="http://www.domain.com/confirm_email.html?action=activate&hash={1}">http://www.domain.com/confirm_email.html?action=activate&hash={1}</a><br /><br />\
    Kind regards,<br />\
    Your Something
    </body></html>

上記は、以下のコードに使用される特定のメッセージです。

String country = "AU";
Object[] args = new Object[] { account.getLogin(), confirm.getHash() };

helper.setText(appContext.getMessage("mailconfirm.mail.body", args,
                new Locale(country)), true);

私は両方の引数をデバッグしましたが、どちらも正しい値を持っています。デバッグ時appContext.getMessage行、{1}パラメータに正しい値が入力されていません{0}です。

何が間違っているのでしょうか?ロケールの問題である可能性があります。

32
Rihards

問題は解決しました!問題は、メッセージmailconfirm.mail.bodyに{0}の後と{1}の間のどこかにアポストロフィが含まれていたためと思われます。交換後doesn'tdoes not問題を修正しました。そこではアポストロフィが使えないことを知りませんでした。追伸それはバグですか、それとも単なる間違いで、アポストロフィはエスケープする必要がありますか?

mailconfirm.mail.body=<html><body><h3 style="margin: 0 0 1em;">Hi, {0}!</h3>\
    To confirm your email address, click on the confirmation link given bellow. If clicking on the link doesn't work, copy and paste the link in a new browser tab. <br /><br />\
    <a href="http://www.domain.com/confirm_email.html?action=activate&hash={1}">http://www.domain.com/confirm_email.html?action=activate&hash={1}</a><br /><br />\
    Kind regards,<br />\
    Your Something
    </body></html>

1 doesn'tそれを理解して修正をプッシュするのに約1時間かかりました。ははは。今からアポストロフィは悪だと思います!

62
Rihards

SpringのResourceBundleMessageSource(私はあなたが使用していると思います)は、MessageFormatを使用してプレースホルダー({0})メッセージ内。 MessageFormatでは、単一引用符(')は、2つの単一引用符('')(参照: MessageFormat Javadoc )。

ただし、デフォルトでは、引数を含まないメッセージはMessageFormatによって解析されません。したがって、引数のないメッセージの単一引用符はエスケープする必要はありません。

ResourceBundleMessageSourceは、alwaysUseMessageFormatをすべてのメッセージに適用する必要がある場合に使用できるMessageFormatと呼ばれるフラグを提供します。したがって、単一引用符は常に2つの単一引用符でエスケープする必要があります。

詳細はこちら ブログ投稿 をご覧ください。

32
micha

ビジネスチームに必要な場所にダブルアポを追加するように説得することができず、場合によっては忘れてしまいます。したがって、ReloadableResourceBundleMessageSource#loadPropertiesを次のようにオーバーライドしました:値に"'""{0"が含まれている場合は、"'""''"に置き換えて、プロパティに同じキー。

7
Malai

もう1つの方法は、String.formatを使用して、{X}%sに変更することです。

mailconfirm.mail.body=<html><body><h3 style="margin: 0 0 1em;">Hi, %s!</h3>\
    To confirm your email address click on the confirmation link given bellow. If clicking on the link doesn't work, copy and paste the link in a new browser tab. <br /><br />\
    <a href="http://www.domain/confirm_email.html?action=activate&hash=%s">http://www.domain/confirm_email.html?action=activate&hash=%s</a><br /><br />\
    Kind regards,<br />\
    Your Something
    </body></html>


String whatEver = messageSource.getMessage("mailconfirm.mail.body", null, locale);

whatEver = String.format(whatEver,account.getLogin(), confirm.getHash() );

お役に立てれば幸いです。

0
Willem Kop