Le fichier Spring @Configuration avec le bean PropertyPlaceholderConfigurer ne résout pas l'annotation @Value
J'ai fichier de configuration suivant:
@Configuration
public class PropertyPlaceholderConfigurerConfig {
@Value("${property:defaultValue}")
private String property;
@Bean
public static PropertyPlaceholderConfigurer ppc() throws IOException {
PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
ppc.setLocations(new ClassPathResource("properties/" + property + ".properties"));
ppc.setIgnoreUnresolvablePlaceholders(true);
return ppc;
}
}
Je lance mon application avec la VM option:
-Dproperty=propertyValue
Donc je voudrais que mon application à charger propriété spécifique de fichiers au démarrage. Mais pour une raison quelconque, à ce stade, @Value
les annotations ne sont pas traitées et la propriété est null
. D'autre part, si j'ai PropertyPlaceholderConfigurer
configuré via le fichier xml - tout fonctionne parfaitement comme prévu. Fichier Xml exemple:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreResourceNotFound" value="true"/>
<property name="location">
<value>classpath:properties/${property:defaultValue}.properties</value>
</property>
</bean>
Si j'essaie d'injecter la valeur de la propriété dans un autre fichier de configuration Spring - il est bien injecté. Si je déplace mon PropertyPlaceholderConfigurer
bean création de ce fichier de configuration - valeur du champ est nulle à nouveau.
Comme solution de contournement, j'utilise cette ligne de code:
System.getProperties().getProperty("property", "defaultValue")
Qui est fonctionne aussi, mais j'aimerais savoir pourquoi un tel comportement ne se produit et peut-être qu'il est possible de réécrire une autre manière mais sans xml?
source d'informationauteur Oleksii Duzhyi
Vous devez vous connecter pour publier un commentaire.
De Printemps JavaDoc:
Donc, vous essayez d'utiliser un espace réservé dans le bloc de code requis pour permettre à l'espace réservé de traitement.
@M. Deinum mentionné, vous devez utiliser un PropertySource (par défaut ou personnalisé de mise en œuvre).
Exemple ci-dessous montre comment utiliser les propriétés dans un PropertySource annotation ainsi que la façon d'injecter des propriétés de la PropertySource dans un champ.
Pour tous les autres pauvres âmes qui n'ont pas pu obtenir que cela fonctionne dans certaines classes de Configuration lorsqu'ils travaillent dans d'autres:
Attendons de voir ce que les autres haricots que vous avez dans la classe et si l'un d'entre eux instancié début de l'ApplicationContext. Un ConversionService exemple, en est une. Cela permettrait de créer une instance de la classe de Configuration avant de ce qui est nécessaire est inscrit, ce qui rend la propriété de l'injection de prendre place.
J'ai résolu ce problème en déplaçant le ConversionService à une autre classe de Configuration que j'ai Importé.
Si vous exécutez votre application à l'aide de VM option et que vous souhaitez accéder à cette option dans votre application, vous avez à faire, c'est un peu différent:
Votre PropertyPlaceholderConfigurer n'est pas au courant des propriétés du système, notez également que vous accédez à des propriétés à l'aide de
$
- qui se réfère à la place des titulaires et des#
fait référence aux haricots, oùsystemProperties
est un haricot.