J'ai déjà travaillé dans un autre projet, je suis en train de refaire la même chose, mais pour une raison quelconque, cela ne fonctionne pas. Le @Value
de printemps ne lit pas dans le fichier de propriétés, mais prend littéralement la valeur.
AppConfig.Java
@Component
public class AppConfig
{
@Value("${key.value1}")
private String value;
public String getValue()
{
return value;
}
}
applicationContext.xml:
<context:component-scan
base-package="com.test.config" />
<context:annotation-config />
<bean id="appConfigProperties"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:appconfig.properties" />
</bean>
appconfig.properties
key.value1=test value 1
Dans mon contrôleur, où j'ai:
@Autowired
private AppConfig appConfig;
L’application commence très bien, mais quand je le fais
appConfig.getValue()
il revient
${key.value1}
Cela ne résout pas la valeur dans le fichier de propriétés.
Pensées?
Le problème est dû à un problème dans applicationContext.xml vs spring-servlet.xml - il s’agissait d’un problème de périmètre entre les beans.
pedjaradenkovic m'a gentiment indiqué une ressource existante: L'annotation Spring @Value dans la classe @Controller n'évalue pas la valeur dans le fichier de propriétés et Spring 3.0.5 n'évalue pas l'annotation @Value des propriétés
J'ai aussi trouvé que la raison pour laquelle @value
ne fonctionnait pas est que @value
requiert PropertySourcesPlaceholderConfigurer
au lieu d'une PropertyPlaceholderConfigurer
. J'ai fait les mêmes modifications et cela a fonctionné pour moi. J'utilise Spring 4.0.3 release .
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
Dans mon cas, les champs statiques ne seront pas injectés.
J'utilisais Spring Boot et, pour moi, la mise à niveau de la version de 1.4.0.RELEASE
à 1.5.6.RELEASE
a résolu ce problème.
Lisez le commentaire de pedjaradenkovic.
En plus du lien fourni, la raison pour laquelle cela ne fonctionne pas est que le traitement de @Value
nécessite une variable PropertySourcesPlaceholderConfigurer
au lieu d'une PropertyPlaceholderConfigurer
.
pour l'utilisateur Sprig-boot, PropertyPlaceholderConfigurer et le nouveau PropertySourcesPlaceholderConfigurer ajouté à Spring 3.1. il est donc facile d'accéder au fichier de propriétés. juste injecter
Remarque: Assurez-vous que votre propriété n'est pas Static
@Value("${key.value1}")
private String value;
Dans mon cas, il me manquait les accolades. J'ai eu @Value("foo.bar") String value
au lieu de la forme correcte @Value("${foo.bar}") String value