Platzhalter im Zeichenfolgenwert konnte nicht aufgelöst werden

88

Ich versuche, Eigenschaften aus einer .propertiesDatei 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 @ValueAnmerkungen, um die Eigenschaften abzurufen. Es ist auch als Spring Service deklariert und mit meiner infraContext.xmlDatei 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-placeholderverknüpfe ich diese Datei mit meiner context-core.propertiesDatei:

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 :).

Hwen
quelle
1
Wo wird du infraContext.xmlgeladen? Dem Stacktrace nach zu urteilen, ist es nicht in der Konfiguration enthalten, die von der geladen wird ContextLoaderListener. Bitte posten Sie Ihre web.xml.
M. Deinum
2
Das Problem ist, dass Sie mehrere Instanzen haben, von denen eine PropertySourcesPlaceholderConfigurerexplizit definiert ist (warum?) Und eine aufgrund des Namespace. Der in dir applicationContext.xmltut nichts und fügt nichts hinzu. Entfernen Sie es.
M. Deinum

Antworten:

74

In Ihrer Konfiguration haben Sie 2 PropertySourcesPlaceholderConfigurerInstanzen.

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 PlaceholderConfigurerschnell ausfallen. Wenn ein Platzhalter nicht aufgelöst werden kann, wird eine Ausnahme ausgelöst. Die Instanz aus der applicationContext.xmlDatei 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.

M. Deinum
quelle
Genial, danke, also nehme ich an, dass es im Frühling nur eine Instanz von a geben kann PlaceholderConfigurer?
Mushtaq Jameel
11
Nein, Sie können mehrere haben, aber standardmäßig schlagen sie schnell fehl, wenn kein Platzhalter gefunden wird. Sie können dies , indem Sie deaktivieren ignore-unresolved-placeholderszu true.
M. Deinum
3
Wie kann ich im Frühjahr mit Anmerkungen damit umgehen?
RezKesh
5

Ich hatte das gleiche Problem, löste es durch Hinzufügen

<filtering>true</filtering> 

in pom.xml:

vorher (hat nicht funktioniert):

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>               
        </resource>
    </resources>
</build>

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.

user2910552
quelle
Danke, das hat mein Problem gelöst. Ich bin allerdings gespannt, warum / wie sich das Maven-Ressourcen-Plugin auf die Spring-Platzhalter auswirkt ... Ich hätte nie gedacht, dass sie verwandt sind!
Pim Hazebroek
3

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 verwenden

Beispiel:

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

app.title=Learning Spring
Gani
quelle
1
Gilt dies für Spring4 und höher?
Malkocoglu
Ja @Malkocoglu
Gani
3

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:

spring:
    application:
       name: applicationName
............................
    myProperties:
       property1: property1value

Während der Code erwartete, dass es so sein würde:

spring:
    application:
        name: applicationName
.............................
myProperties:
    property1: property1value
Semir Deljić
quelle
3

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.

Akasha
quelle
Okay ... das hat mir geholfen. Tatsächlich enthält meine App viele Anwendungs-<Profil> .yml-Dateien, und ich habe einen Fehler aufgrund einer neuen Eigenschaft erhalten, die in der Hauptkonfiguration definiert wurde. nur Datei. Ehrlich gesagt hatte ich erwartet, den Wert in der Hauptkonfiguration nur einmal zu definieren und für den Fall, dass der Wert in einer profilspezifischen Konfiguration überschrieben wird. Sieht so aus, als würde es nicht so funktionieren, und es muss immer ein Standardwert angegeben werden. Jetzt verstehe ich, warum meine Java-Konfigurationen fehlgeschlagen sind, als ich Eigenschaften nicht mit einem Standardwert initialisiert habe! Kann dieses Verhalten geändert werden? Danke :-)
funder7
3

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.

Ankush Thakur
quelle
0

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

foo=all-env-foo

src / main / resources / application-rec.properties

bar=rec-bar

src / main / resources / application-prod.properties

bar=prod-bar

In den VM-Argumenten von Application.java

-Dspring.profiles.active=[rec|prod]

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:

The following profiles are active: rec
foo=all-env-foo
bar=rec-bar

In der Protokolldatei für -Dspring.profiles.active = prod:

The following profiles are active: prod
foo=all-env-foo
bar=prod-bar

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.

cdesmetz
quelle
0

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

Dhivya
quelle
0

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

   <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-context</artifactId>
    </dependency>
YAO ALEX DIDIER AKOUA
quelle
-1

Das Löschen oder Beschädigen der Datei pom.xml kann diesen Fehler verursachen.

Renato Vasconcellos
quelle
-3

Meine Lösung bestand darin, ein Leerzeichen zwischen $ und {einzufügen.

Zum Beispiel:

@Value("${project.ftp.adresse}")

wird

@Value("$ {project.ftp.adresse}")
Ben G.
quelle