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}
です。
何が間違っているのでしょうか?ロケールの問題である可能性があります。
問題は解決しました!問題は、メッセージmailconfirm.mail.bodyに{0}の後と{1}の間のどこかにアポストロフィが含まれていたためと思われます。交換後doesn't
とdoes 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時間かかりました。ははは。今からアポストロフィは悪だと思います!
SpringのResourceBundleMessageSource
(私はあなたが使用していると思います)は、MessageFormat
を使用してプレースホルダー({0}
)メッセージ内。 MessageFormat
では、単一引用符('
)は、2つの単一引用符(''
)(参照: MessageFormat Javadoc )。
ただし、デフォルトでは、引数を含まないメッセージはMessageFormat
によって解析されません。したがって、引数のないメッセージの単一引用符はエスケープする必要はありません。
ResourceBundleMessageSource
は、alwaysUseMessageFormat
をすべてのメッセージに適用する必要がある場合に使用できるMessageFormat
と呼ばれるフラグを提供します。したがって、単一引用符は常に2つの単一引用符でエスケープする必要があります。
詳細はこちら ブログ投稿 をご覧ください。
ビジネスチームに必要な場所にダブルアポを追加するように説得することができず、場合によっては忘れてしまいます。したがって、ReloadableResourceBundleMessageSource#loadProperties
を次のようにオーバーライドしました:値に"'"
&"{0"
が含まれている場合は、"'"
を"''"
に置き換えて、プロパティに同じキー。
もう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() );
お役に立てれば幸いです。