web-dev-qa-db-fra.com

balise de message de printemps avec plusieurs arguments

J'essaie d'obtenir le message i18n comme ci-dessous:

messageCode = Message de test pour {0} et {1} et {2}.

En jsp, j'ai ceci:

<spring:message code="messageCode" 
                arguments="${value1},${value2},${value3}" 
                htmlEscape="false"/>

Les arguments:

value1=A,B
value2=C,D
value3=E,F

La sortie pour ce que je veux:

Test message for A,B and C,D and E,F 

La sortie réelle:

Test message for A and B and C

Y a-t-il un moyen de surmonter cela? Je vous remercie.

George

32
George Sun

La cause du problème est que , (virgule) est le séparateur par défaut. Donc, à la fin, la balise de message de printemps obtiendra la chaîne A,B,C,D,E,F pour le paramètre arguments, et il divisera cette chaîne en 6 arguments internes différents pour le message.

Vous devez changer le séparateur. Si tu utilises ; par exemple, alors cela fonctionnera.

<spring:message code="messageCode"
       arguments="${value1};${value2};${value3}"
       htmlEscape="false"
       argumentSeparator=";"/>

@See Spring Reference: Appendice F.6 The Message Tag

57
Ralph

Vous pouvez également envoyer les différentes valeurs sous forme de tableau et ne laisser aucune place au printemps en faisant une erreur dans la façon d'analyser l'argument chaîne.

<c:set var="value1" value="A,B;X" />
<c:set var="value2" value="C,D;Y" />
<c:set var="value3" value="E,F;Z" />

<spring:message code="messageCode"
   arguments="${[value1, value2, value3]}"
   htmlEscape="false" />

De cette façon, vous n'avez plus à vous soucier de l'utilisation de votre nouveau séparateur d'une manière ou d'une autre à un moment donné.

1
Mahdi

J'utilise une approche complètement différente. Ma source de messages basée sur une base de données est exposée dans ma configuration avec le nom i18n:

@Bean(name = {"i18n", "messageSource"})
public MessageSource messageSource() {
    return new JpaMessageSource();
}

et j'expose également mes beans avec viewResolver.setExposeContextBeansAsAttributes(true); Après cela, je peux utiliser ${i18n.message("messageCode", value1, value2, value3)} dans mes vues jsp.

1
Vadim Ferderer