web-dev-qa-db-fra.com

Pourquoi les arguments Spring MessageSource ne sont pas renseignés correctement dans certains paramètres régionaux?

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.

27
Rihards

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!

60
Rihards

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.

32
micha

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é.

7
Malai

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.

0
Willem Kop