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>
Ceci est le message particulier utilisé pour le code ci-dessous.
String country = "AU";
Object[] args = new Object[] { account.getLogin(), confirm.getHash() };
helper.setText(appContext.getMessage("mailconfirm.mail.body", args,
new Locale(country)), true);
J'ai débogué les deux arguments et ils ont tous deux les bonnes valeurs. Lors du débogage de la ligne appContext.getMessage
, j'ai constaté que le paramètre {1}
n'était pas rempli avec la valeur correcte, mais que {0}
l'était.
Des idées ce qui pourrait être le problème? Je soupçonne que cela pourrait être un problème de lieu.
Problème résolu! Il semble que le problème soit dû au fait que le message mailconfirm.mail.body contenait une apostrophe quelque part après {0} et entre {1}. Après avoir remplacé doesn't
par does not
, le problème a été résolu. Je ne savais pas que les apostrophes ne pouvaient pas être utilisées ici. P.S. Est-ce un bug ou juste mon erreur et les apostrophes devraient être échappé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>
Un doesn't
m'a pris environ une heure pour le comprendre et proposer un correctif. Hahaha .. À partir de maintenant, je considère que les apostrophes sont diaboliques!
La variable ResourceBundleMessageSource
de Spring (que je pense que vous utilisez) utilise MessageFormat
pour remplacer les espaces réservés ({0}
) dans les messages. MessageFormat
nécessite que les guillemets simples ('
) soient protégés à l'aide de deux guillemets simples (''
) (voir: MessageFormat Javadoc ).
Cependant, par défaut, les messages ne contenant aucun argument ne seront pas analysés par MessageFormat
. Ainsi, les guillemets simples dans les messages sans arguments n'ont pas besoin d'être échappés.
ResourceBundleMessageSource
fournit un indicateur appelé alwaysUseMessageFormat
qui peut être utilisé si MessageFormat
doit être appliqué à tous les messages. Ainsi, une citation unique doit toujours être évitée par deux citations simples.
Voir cette blog post pour plus de détails.
Je ne parviens pas à convaincre mon équipe commerciale d'ajouter des doubles apos aux endroits requis et parfois, ils oublient également. J'ai donc écrasé ReloadableResourceBundleMessageSource#loadProperties
par: Si la valeur contient, "'"
& "{0"
, puis remplacez le "'"
par "''"
et insérez-le dans les propriétés avec la même clé.
Une alternative consiste à utiliser String.format
, changer le {X}
pour %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() );
J'espère que c'est utile.