Ich versuche, Eigenschaften aus einer .properties
Datei zu verwenden, aber es scheint nicht zu funktionieren.
Hier ist mein Code:
@Service("ServiceFTP")
@Transactional
public class ServiceFTPImpl implements ServiceFTP {
@Value("${project.ftp.adresse}")
private String adresse;
@Value("${project.ftp.login}")
private String compte;
@Value("${project.ftp.password}")
private String motDePasse;
@Value("${project.ftp.root}")
private String ROOT;
[...]
}
Diese Klasse verwendet @Value
Anmerkungen, um die Eigenschaften abzurufen. Es ist auch als Spring Service deklariert und mit meiner infraContext.xml
Datei verknüpft :
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<context:property-placeholder location="classpath:context-core.properties"/>
[...]
</beans>
Mit context:property-placeholder
verknüpfe ich diese Datei mit meiner context-core.properties
Datei:
project.ftp.adresse = localhost
project.ftp.login = anonymous
project.ftp.password =
project.ftp.root = /anonymous/
Das macht doch Sinn, oder?
Wenn ich jedoch versuche, mein Projekt zu starten, löst Tomcat diese Ausnahme aus:
ERROR [context.ContextLoader.initWebApplicationContext()] Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ServiceFTP': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String project.sins.service.impl.ServiceFTPImpl.adresse; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'project.ftp.adresse' in string value "${project.ftp.adresse}"
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:607)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:925)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:472)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:388)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:293)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4887)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5381)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:657)
at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1636)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String project.sins.service.impl.ServiceFTPImpl.adresse; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'project.ftp.adresse' in string value "${project.ftp.adresse}"
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:513)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:92)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:284)
... 27 more
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'project.ftp.adresse' in string value "${project.ftp.adresse}"
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:173)
at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:125)
at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:151)
at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:142)
at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$2.resolveStringValue(PropertySourcesPlaceholderConfigurer.java:169)
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:748)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:740)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:730)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:485)
... 29 more
Oder kurz: java.lang.IllegalArgumentException: Could not resolve placeholder 'project.ftp.adresse' in string value "${project.ftp.adresse}"
EDIT:
Hier ist meine web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="sins" version="2.5">
<display-name>Project</display-name>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<context-param>
<param-name>log4jExposeWebAppRoot</param-name>
<param-value>false</param-value>
</context-param>
<filter>
<filter-name>ExpiresFilter</filter-name>
<filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
<init-param>
<param-name>ExpiresByType text/html</param-name>
<param-value>now plus 0 seconds</param-value>
</init-param>
<init-param>
<param-name>ExpiresByType application/json</param-name>
<param-value>now plus 0 seconds</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>ExpiresFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
<filter-class>
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>
</listener>
<context-param>
<param-name>
org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG
</param-name>
<param-value>
/WEB-INF/tiles/user.xml
</param-value>
</context-param>
<resource-ref>
<res-ref-name>jdbc/si_nsg</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
</web-app>
Meine infraContext.xml wird in eine andere XML-Datei mit dem Namen applicationContext.xml importiert:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd">
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="environment">
<bean class="org.springframework.web.context.support.StandardServletEnvironment"/>
</property>
</bean>
<import resource="classpath:securityContext.xml"/>
[...]
<import resource="classpath:project/sins/persistenceContext.xml"/>
<import resource="classpath:project/sins/infraContext.xml"/>
</beans>
Mir fehlt offensichtlich etwas, aber ich kann nicht herausfinden, was.
Bitte lassen Sie mich wissen, wenn Sie weitere Details benötigen, da dies meine erste Frage hier ist, werde ich versuchen, sie so schnell wie möglich zu beantworten :).
infraContext.xml
geladen? Dem Stacktrace nach zu urteilen, ist es nicht in der Konfiguration enthalten, die von der geladen wirdContextLoaderListener
. Bitte posten Sie Ihre web.xml.PropertySourcesPlaceholderConfigurer
explizit definiert ist (warum?) Und eine aufgrund des Namespace. Der in dirapplicationContext.xml
tut nichts und fügt nichts hinzu. Entfernen Sie es.Antworten:
In Ihrer Konfiguration haben Sie 2
PropertySourcesPlaceholderConfigurer
Instanzen.applicationContext.xml
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> <property name="environment"> <bean class="org.springframework.web.context.support.StandardServletEnvironment"/> </property> </bean>
infraContext.xml
<context:property-placeholder location="classpath:context-core.properties"/>
Standardmäßig wird a
PlaceholderConfigurer
schnell ausfallen. Wenn ein Platzhalter nicht aufgelöst werden kann, wird eine Ausnahme ausgelöst. Die Instanz aus derapplicationContext.xml
Datei hat keine Eigenschaften und schlägt daher auf allen Platzhaltern fehl.Lösung: Entfernen Sie die Datei aus applicationContext.xml, da sie nichts hinzufügt und nur Dinge kaputt macht.
quelle
PlaceholderConfigurer
?ignore-unresolved-placeholders
zutrue
.Ich hatte das gleiche Problem, löste es durch Hinzufügen
<filtering>true</filtering>
in pom.xml:
vorher (hat nicht funktioniert):
nach (es hat funktioniert):
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>
Danach führen Sie einfach mvn clean install aus und stellen die Anwendung bereit.
quelle
Dieses Problem tritt auf, wenn die Anwendung nicht auf die Datei some_file_name.properties zugreifen kann. Stellen Sie sicher, dass die Eigenschaftendatei im Frühjahr im Ressourcenordner abgelegt wird.
Schritte zur Fehlerbehebung
1: Fügen Sie die Eigenschaftendatei unter dem Ressourcenordner hinzu.
2: Wenn Sie keinen Ressourcenordner haben. Erstellen Sie eine, indem Sie neu navigieren, indem Sie mit der rechten Maustaste auf das Projekt neu> Quellordner klicken, es als Ressource benennen und Ihre Eigenschaftendatei darunter platzieren.
Für annotationsbasierte Implementierung
Hinzufügen
@PropertySource(ignoreResourceNotFound = true, value = "classpath:some_file_name.properties")
// Fügen Sie es hinzu, bevor Sie den Platzhalter verwendenBeispiel:
Assignment1Controller.Java
@PropertySource(ignoreResourceNotFound = true, value = "classpath:assignment1.properties") @RestController public class Assignment1Controller { // @Autowired // Assignment1Services assignment1Services; @Value("${app.title}") private String appTitle; @RequestMapping(value = "/hello") public String getValues() { return appTitle; } }
Zuordnung1.Eigenschaften
quelle
In meinem Fall war ich beim Zusammenführen der Datei application.yml nachlässig und habe meine Eigenschaften unnötig nach rechts eingerückt.
Ich habe es so eingerückt:
Während der Code erwartete, dass es so sein würde:
quelle
Sie können auch Standardwerte ausprobieren. Federwert-Annotation
Standardwerte können für Eigenschaften angegeben werden, die möglicherweise nicht definiert sind. In diesem Beispiel wird der Wert "some default" eingefügt:
@Value("${unknown.param:some default}") private String someDefault;
Wenn dieselbe Eigenschaft als Systemeigenschaft und in der Eigenschaftendatei definiert ist, wird die Systemeigenschaft angewendet.
quelle
Ich habe den gleichen Fehler in meinem Micro-Service erhalten, wenn Sie die Annotation @Value im Programm deklarieren, dh @Value ("$ {project.api.key}").
Stellen Sie sicher, dass Ihre application.properties-Datei mit denselben Werten nicht leer sein darf. project.api.key = einige Werte hinzufügen
MostIMP : Andernfalls wird der Fehler "Fehler beim Erstellen der Bean mit dem Namen 'ServiceFTP': Injection von automatisch verdrahteten Abhängigkeiten" ausgegeben.
quelle
Mit Spring Boot:
In der pom.xml
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <addResources>true</addResources> </configuration> </plugin> </plugins> </build>
Beispiel in der Klasse Java
@Configuration @Slf4j public class MyAppConfig { @Value("${foo}") private String foo; @Value("${bar}") private String bar; @Bean("foo") public String foo() { log.info("foo={}", foo); return foo; } @Bean("bar") public String bar() { log.info("bar={}", bar); return bar; } [ ... ]
In den Eigenschaftendateien:
src / main / resources / application.properties
src / main / resources / application-rec.properties
src / main / resources / application-prod.properties
In den VM-Argumenten von Application.java
Vergessen Sie nicht, den Befehl mvn auszuführen, nachdem Sie die Eigenschaften geändert haben!
mvn clean package -Dmaven.test.skip=true
In der Protokolldatei für -Dspring.profiles.active = rec:
In der Protokolldatei für -Dspring.profiles.active = prod:
In der Protokolldatei für -Dspring.profiles.active = local:
Could not resolve placeholder 'bar' in value "${bar}"
Oups, ich habe vergessen, application-local.properties zu erstellen.
quelle
Ich habe den gleichen Fehler in meinem Microservice-Projekt erhalten. Die Eigenschaft selbst hat in meiner yml-Datei gefehlt. Also habe ich den Namen und den Wert der Eigenschaft hinzugefügt, die mein Problem lösen
quelle
Dieser Fehler tritt auf, weil das Spring-Projekt die Dateieigenschaften ( bootstrap.yml oder application.yml ) nicht liest . Um dies zu beheben, müssen Sie in Ihrer pom.xml eine Abhängigkeit hinzufügen
quelle
Das Löschen oder Beschädigen der Datei pom.xml kann diesen Fehler verursachen.
quelle
Meine Lösung bestand darin, ein Leerzeichen zwischen $ und {einzufügen.
Zum Beispiel:
@Value("${project.ftp.adresse}")
wird
@Value("$ {project.ftp.adresse}")
quelle