Obtenir un message localisé à partir de resourceBundle via des annotations dans Spring Framework
Est-il possible de faire cela ? Actuellement, il est fait comme ceci :
<bean id="resource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>content.Language</value>
</list>
</property>
</bean>
@Autowired
protected MessageSource resource;
protected String getMessage(String code, Object[] object, Locale locale) {
return resource.getMessage(code, object, locale);
}
Est-il un moyen pour que ça ressemble à l'obtention de propriétés via @Valeur annotation ?
<util:properties id="generals" location="classpath:portlet.properties" />
@Value("#{generals['supported.lang.codes']}")
public String langCodes;
Parce que d'avoir à appeler la méthode est généralement très bien, mais lorsque, par exemple, les tests unitaires, c'est la douleur dans ... ... Bien, dans certains cas, webdriver est PageObject modèle où les objets n'ont pas d'initialisation, ce serait vraiment utile
source d'informationauteur lisak
Vous devez vous connecter pour publier un commentaire.
Je crois que vous mélangé les deux concepts:
Propriété des fichiers contient des propriétés (paramètres régionaux indépendants). Au Printemps, ils peuvent être chargés, par exemple via des
util:properties
et peut être utilisé dans@Value
annotations.Mais le message de regroupements de ressources (qui sont bases sur des fichiers qui ressemblent à des fichiers de propriété) sont de langue dependend. Au Printemps, vous pouvez les charger via
org.springframework.context.support.ResourceBundleMessageSource
. Mais pas injecter dans une Chaîne de caractères via@Value
. Vous ne pouvez pas injecter, parce que la@Value
injection est effectuée une fois par bean, la@Value
sera évaluée une fois (la plupart à l'heure de début), et la valeur calculée sera injecté. Mais ce n'est pas ce que vous devez normalement lorsque vous avez des Messages, des offres de Ressources. Car ensuite, vous devez évaluer la valeur à chaque fois que la variable est utilisée, selon la langue d'un utilisateur.Mais vous pouvez construire facilement par votre propre!
Les seules choses dont vous avez besoin est de cette classe:
Alors vous pouvez l'utiliser de cette façon:
Pour l'obtenir en cours d'exécution, vous devez activer
<context:spring-configured />
à son tour sur AspectJ @Configurable, et (Qui est importent) vous avez besoin d'instancier la Ressouce Bundle Source de Message dans le même contexte de l'application (par exemple dans les applications web que vous mettez leReloadableResourceBundleMessageSource
définition dans la plupart des cas, dans l'application web du contexte, mais cela ne fonctionne pas dans ce cas, parce que l'objet du MSG est dans la "normale" contexte de l'application.Le point est que c'est vraiment utile que pour les Tests Unitaires. En application réelle, Locale est une des informations d'exécution qui ne peut pas être codé en dur dans l'annotation. Locale est décidé en fonction de paramètres régionaux dans l'Exécution.
Btw, vous pouvez facilement mettre en place par vous-même, quelque chose comme :
Et