Почему аргументы 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}.

Есть идеи, что может быть не так? Я подозреваю, что это может быть какая-то проблема с локалью.


person Rihards    schedule 13.06.2011    source источник


Ответы (4)


Проблема решена! Похоже, проблема заключалась в том, что сообщение mailconfirm.mail.body содержало апостроф где-то после {0} и между {1}. После замены doesn't на does not проблема устранена. Я не знал, что там нельзя использовать апострофы. P.S. Это ошибка или просто моя ошибка и апострофы нужно экранировать?

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>

На один doesn't у меня ушло около часа, чтобы разобраться и внести исправление. Ха-ха-ха.. Отныне я считаю апострофы злом!

person Rihards    schedule 13.06.2011
comment
Ура! Поскольку ты потратил на это час, мне не пришлось. Кроме того, оказывается, что вы можете заставить свои одинарные кавычки работать правильно, удвоив их, например ''. Это будет отображаться как одинарная кавычка, а также будет хорошо работать с аргументами MessageSource. Но сбивает с толку то, что это только работает в строках свойств, которые имеют параметры, иначе это приведет к отображению обоих апострофов. - person aroth; 15.07.2011
comment
Эта ссылка может быть полезна для лучшего понимания происходящего: blog.pfa-labs.com/2010/07/ - person Mopper; 19.10.2012
comment
то же самое для mscharhag.com/2013/10/ и флаг alwaysUseMessageFormat ResourceBundleMessageSource - person EpicPandaForce; 26.02.2015
comment
примечание: если вы собираетесь копировать/вставлять вышеприведенный mailconfirm.mail.body..... обязательно измените это не -› не.... Я потратил 30 минут по иронии судьбы, устраняя эту проблему, ха-ха. - person Selwyn; 30.05.2015
comment
Сэкономил мне часы и больше часов исследований и с треском провалился... СПАСИБО!!!! - person Vanderson Assis; 17.03.2020

Spring ResourceBundleMessageSource (который, я думаю, вы используете) использует MessageFormat для замены заполнителей ({0}) внутри сообщений. MessageFormat требует, чтобы одинарные кавычки (') экранировались двумя одинарными кавычками ('') (см.: MessageFormat Javadoc).

Однако по умолчанию сообщения, не содержащие никаких аргументов, не будут анализироваться MessageFormat. Поэтому одинарные кавычки в сообщениях без аргументов экранировать не нужно.

ResourceBundleMessageSource предоставляет флаг alwaysUseMessageFormat, который можно использовать, если MessageFormat следует применять ко всем сообщениям. Таким образом, одинарная кавычка всегда должна быть экранирована двумя одинарными кавычками.

Дополнительные сведения см. в этом сообщении в блоге.

person micha    schedule 04.10.2013

Я не могу убедить свою бизнес-команду добавить двойные апостили в нужных местах, и иногда они тоже забывают. Поэтому я просто переопределил ReloadableResourceBundleMessageSource#loadProperties как: если значение содержит "'" и "{0", замените "'" на "''" и введите в свойства тот же ключ.

person Malai    schedule 12.07.2014
comment
Да, важно добавить двойные ',' в ваши сообщения.свойства. Пример: user.locked = Votre compte a été bloqué parce que vous avez saisis {0} fois de suite un mauvais mot de passe. Подвеска с эффектом блокировки {1} минут. - person Aron; 18.02.2015

Альтернативой является использование 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() );

Надеюсь, это полезно.

person Willem Kop    schedule 28.12.2018