Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Could not resolve placeholder in string value

Tags:

java

spring

I am trying to use properties from a .properties file, but it doesn't seem to work.

Here is my 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;  [...]  } 

This class uses @Value annotations to get the properties. It is also declared as a Spring Service and is linked to my infraContext.xml file :

<?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> 

Using context:property-placeholder, I link this file to my context-core.properties file :

project.ftp.adresse = localhost project.ftp.login = anonymous project.ftp.password = project.ftp.root = /anonymous/ 

This does make sense, right ?

But when I try to launch my project, Tomcat throw this exception :

    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 

Or, in short : java.lang.IllegalArgumentException: Could not resolve placeholder 'project.ftp.adresse' in string value "${project.ftp.adresse}"

EDIT :

Here is my 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> 

My infraContext.xml is imported in another .xml file named applicationContext.xml :

<?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> 

I am obviously missing something, but I can't figure out what.

Please let me know if you need more details, as it is my first question here, I'll try to answer as soon as I can :).

like image 798
Hwen Avatar asked Nov 27 '13 14:11

Hwen


People also ask

How do I fix placeholder Cannot resolve?

IllegalArgumentException: Could not resolve placeholder Error You just need to add this lines in your pom. xml file under the <resources> section. Now, your error might be solved. Second solution is Just try to Rebuild Project with Build -> Rebuild Project, Now your error should be fixed.

What is a PropertySourcesPlaceholderConfigurer used for?

PropertySourcesPlaceholderConfigurer is an example of BeanFactoryPostProcessor that is already implemented by Spring. This class is invoked before any object is created. It is used to resolve properties placeholder in Spring Beans on fields annotated with @Value("${property_name}") .

What is context property placeholder?

The context:property-placeholder tag is used to externalize properties in a separate file. It automatically configures PropertyPlaceholderConfigurer , which replaces the ${} placeholders, which are resolved against a specified properties file (as a Spring resource location).

What is application properties in spring boot?

Properties File Properties files are used to keep 'N' number of properties in a single file to run the application in a different environment. In Spring Boot, properties are kept in the application. properties file under the classpath. The application.properties file is located in the src/main/resources directory.


1 Answers

In your configuration you have 2 PropertySourcesPlaceholderConfigurer instances.

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"/> 

By default a PlaceholderConfigurer is going to fail-fast, so if a placeholder cannot be resolved it will throw an exception. The instance from the applicationContext.xml file has no properties and as such will fail on all placeholders.

Solution: Remove the one from applicationContext.xml as it doesn't add anything it only breaks things.

like image 116
M. Deinum Avatar answered Oct 09 '22 00:10

M. Deinum