Warum werden Spring MessageSource-Argumente in einigen Gebietsschemas nicht korrekt ausgefüllt?
-
27-10-2019 - |
Frage
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>
Dies oben ist die spezielle Nachricht, die für den folgenden Code verwendet wird.
String country = "AU";
Object[] args = new Object[] { account.getLogin(), confirm.getHash() };
helper.setText(appContext.getMessage("mailconfirm.mail.body", args,
new Locale(country)), true);
Ich habe beide Argumente debuggt und beide haben die richtigen Werte.Beim Debuggen der appContext.getMessage
-Zeile habe ich festgestellt, dass der {1}
-Parameter nicht mit dem richtigen Wert gefüllt ist, der {0}
jedoch.
Irgendwelche Ideen, was falsch sein könnte?Ich vermute, es könnte sich um ein Gebietsschema handeln.
Lösung
Problem gelöst!
Es scheint, dass das Problem darin bestand, dass die Nachricht mailconfirm.mail.body irgendwo nach {0} und zwischen {1} ein Apostroph enthielt.Nachdem der doesn't
durch den does not
ersetzt wurde, wurde das Problem behoben.Ich wusste nicht, dass Apostrophe dort nicht verwendet werden können.
P.S.Ist es ein Fehler oder nur mein Fehler und Apostrophe sollten entkommen?
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>
Ein doesn't
hat ungefähr eine Stunde gedauert, um es herauszufinden und eine Lösung zu finden.Hahaha .. Von nun an halte ich Apostrophe für böse!
Andere Tipps
Der ResourceBundleMessageSource
von Spring (den Sie vermutlich verwenden) verwendet den MessageFormat
, um Platzhalter ({0}
) in Nachrichten zu ersetzen.MessageFormat
erfordert, dass einfache Anführungszeichen ('
) mit zwei einfachen Anführungszeichen (''
) maskiert werden (siehe: MessageFormat Javadoc ).
Standardmäßig werden Nachrichten, die keine Argumente enthalten, jedoch nicht durch MessageFormat
analysiert.Einfache Anführungszeichen in Nachrichten ohne Argumente müssen also nicht maskiert werden.
ResourceBundleMessageSource
bietet ein Flag namens alwaysUseMessageFormat
, das verwendet werden kann, wenn MessageFormat
auf alle Nachrichten angewendet werden soll.Ein einfaches Anführungszeichen muss also immer von zwei einfachen Anführungszeichen umgangen werden.
Weitere Informationen finden Sie in diesem Blogbeitrag .
Ich kann mein Geschäftsteam nicht davon überzeugen, an den erforderlichen Stellen doppelte Apos hinzuzufügen, und manchmal vergessen sie es auch.
Also habe ich ReloadableResourceBundleMessageSource#loadProperties
einfach überschrieben als:
Wenn der Wert "'"
& "{0"
enthält, ersetzen Sie den "'"
durch "''"
und geben Sie ihn mit demselben Schlüssel in die Eigenschaften ein.
Eine Alternative besteht darin, String.format
zu verwenden und den {X}
für %s
zu ändern.
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() );
Hoffe, es ist nützlich.