Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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> 

This above is the particular message used for the code bellow.

String country = "AU"; Object[] args = new Object[] { account.getLogin(), confirm.getHash() };  helper.setText(appContext.getMessage("mailconfirm.mail.body", args,                 new Locale(country)), true); 

I debugged both arguments and they both have the right values. When debuging appContext.getMessage line, I saw that the {1} param is not filled with correct value however {0} is.

Any ideas what could be wrong? I suspect it could be some locale issue.

like image 800
Rihards Avatar asked Jun 13 '11 15:06

Rihards


2 Answers

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!

like image 65
Rihards Avatar answered Sep 21 '22 16:09

Rihards


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.

like image 26
micha Avatar answered Sep 20 '22 16:09

micha