Why Spring MessageSource arguments are not filled correctly in some locales?

后端 未结 4 1471
陌清茗
陌清茗 2020-12-29 03:05
mailconfirm.mail.body=

Hi, {0}!

\\ To confirm your email address click on the confirmation
相关标签:
4条回答
  • 2020-12-29 03:29

    Issue solved! It appears that the problem was because the message mailconfirm.mail.body contained an apostrophe somewhere after {0} and between {1}. After replaced doesn't with does not it fixed the problem. I didn't know apostrophes can't be used in there. P.S. Is it a bug or just my mistake and apostrophes should be escaped?

    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>
    

    One doesn't took me about an hour to figure it out and push a fix. Hahaha.. From now on I consider apostrophes being evil!

    0 讨论(0)
  • 2020-12-29 03:32

    Spring's ResourceBundleMessageSource (which I think you are using) uses MessageFormat for replacing placeholders ({0}) inside messages. MessageFormat requires that single quotes (') are escaped using two single quotes ('') (see: MessageFormat Javadoc).

    However, by default messages that do not contain any arguments will not be parsed by MessageFormat. So single quotes in messages without arguments don't need to be escaped.

    ResourceBundleMessageSource provides a flag called alwaysUseMessageFormat that can be used if MessageFormat should be applied to all messages. So a single quote need always be escaped by two single quotes.

    See this blog post for more details.

    0 讨论(0)
  • 2020-12-29 03:32

    I am not able to convince my business team to add double apos in required places and some times they are forgetting also. So I just overrided ReloadableResourceBundleMessageSource#loadProperties as : if the value contains, "'" & "{0", then replace the "'" with "''" and put in to the Properties with the same key.

    0 讨论(0)
  • 2020-12-29 03:33

    An alternative is to use String.format, change the {X} for %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() );
    

    Hope it's useful.

    0 讨论(0)
提交回复
热议问题