Dize değerindeki yer tutucu çözülemedi


88

Bir .propertiesdosyadaki özellikleri kullanmaya çalışıyorum ama işe yaramıyor.

İşte kodum:

@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;

[...]

}

Bu sınıf @Value, özellikleri almak için ek açıklamaları kullanır . Aynı zamanda bir Spring Service olarak ilan edildi ve dosyamla bağlantılı infraContext.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: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>

Kullanarak context:property-placeholder, bu dosyayı dosyama context-core.propertiesbağlarım:

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

Bu mantıklı, değil mi?

Ancak projemi başlatmaya çalıştığımda Tomcat şu istisnayı atıyor:

    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

Veya kısaca: java.lang.IllegalArgumentException: Could not resolve placeholder 'project.ftp.adresse' in string value "${project.ftp.adresse}"

DÜZENLE :

İşte benim web.xml dosyam:

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

İnfraContext.xml dosyam, applicationContext.xml adlı başka bir .xml dosyasına içe aktarıldı:

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

Belli ki bir şeyi kaçırıyorum ama ne olduğunu anlayamıyorum.

Daha fazla ayrıntıya ihtiyacınız olursa lütfen bize bildirin, buradaki ilk sorum olduğu için elimden geldiğince çabuk cevaplamaya çalışacağım :).


1
Nereye infraContext.xmlyükleniyorsun? Stacktrace'e bakıldığında ContextLoaderListener,. Lütfen web.xml dosyanızı gönderin.
M.Deinum

2
Sorun, PropertySourcesPlaceholderConfigurerbirinin açıkça tanımlanmış (neden?) Ve ad alanı nedeniyle birden çok örneğine sahip olmanızdır . Gözlerinde farklı bir applicationContext.xmlşey yapıyor ne de herhangi bir şey ilave edilmez. Onu kaldır.
M.Deinum

Yanıtlar:


74

Yapılandırmanızda 2 PropertySourcesPlaceholderConfigurerörneğiniz var.

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

Varsayılan olarak a PlaceholderConfigurerhızlı bir şekilde başarısız olur, bu nedenle bir yer tutucu çözülemezse bir istisna atar. applicationContext.xmlDosyadaki örneğin hiçbir özelliği yoktur ve bu nedenle tüm yer tutucularda başarısız olur.

Çözüm: Biri applicationContext.xml'den kaldırın, çünkü herhangi bir şey eklemez, yalnızca işleri bozar.


Harika, teşekkür ederim, bu yüzden anladığım kadarıyla ilkbaharda a'nın sadece bir örneği olabilir PlaceholderConfigurermi?
Mushtaq Jameel

11
Hayır, birden fazla olabilir, ancak bir yer tutucu bulunmazsa varsayılan olarak hızlı başarısız olurlar. Sen ayarlayarak bu devre dışı bırakabilir ignore-unresolved-placeholdersiçin true.
M.Deinum

3
Ek açıklamalarla bahar önyüklemesinin üstesinden nasıl gelebilirim?
rezKesh

5

Ben de aynı sorunu yaşadım, ekleyerek çözdüm

<filtering>true</filtering> 

pom.xml'de:

daha önce (işe yaramadı):

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

sonra (işe yaradı):

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

Bundan sonra mvn clean install ve deploy uygulamasını çalıştırın .


Teşekkürler, bu sorunumu çözdü. Yine de merak ediyorum, maven kaynakları eklentisi bahar yer tutucularını neden / nasıl etkiliyor ... Bunların ilişkili olduğunu asla tahmin edemezdim!
Pim Hazebroek

3

Bu Sorun, uygulama bazı_dosya_adı.properties dosyasına erişemediğinde oluşur. Özellikler dosyasının ilkbaharda kaynaklar klasörünün altına yerleştirildiğinden emin olun.

Sorun Giderme Adımları

1: Özellikler dosyasını kaynak klasörünün altına ekleyin.

2: Bir kaynak klasörünüz yoksa. Yeni> Kaynak Klasör projesine sağ tıklayarak yeni bir tane oluşturun, kaynak olarak adlandırın ve özellikler dosyanızı altına yerleştirin.

Açıklama tabanlı Uygulama için

Ekle @PropertySource(ignoreResourceNotFound = true, value = "classpath:some_file_name.properties")// Yer tutucuyu kullanmadan önce ekle

Misal:

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;

        }  

}

atama1.properties

app.title=Learning Spring

1
Bu Spring4 ve sonrası için geçerli mi?
Malkocoglu

Evet @Malkocoglu
Gani

3

Benim durumumda, application.yml dosyasını birleştirirken dikkatsiz davrandım ve özelliklerimi sağa doğru girintili gereksiz hale getirdim.

Bunu şu şekilde girdim:

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

Kod böyle olmasını beklerken:

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

3

Varsayılan değerleri de deneyebilirsiniz. bahar değeri ek açıklaması

Tanımlanamayan özellikler için varsayılan değerler sağlanabilir. Bu örnekte "bazı varsayılan" değeri enjekte edilecektir:

@Value("${unknown.param:some default}")
private String someDefault;

Aynı özellik bir sistem özelliği olarak ve özellikler dosyasında tanımlanırsa, sistem özelliği uygulanır.


Tamam ... bu bana yardımcı oldu. Aslında uygulamamın birçok application- <profile> .yml dosyası var ve ana yapılandırmada tanımlanan yeni bir özellik nedeniyle bir hata alıyordum. sadece dosya. Dürüst olmak gerekirse, değeri ana konfigürasyonda yalnızca bir kez tanımlamayı ve bu durumda profile özgü bir konfigürasyonda değeri geçersiz kılmayı bekliyordum. Görünüşe göre bu şekilde çalışmıyor ve her zaman varsayılan bir değer sağlanmalıdır. Şimdi, özellikleri varsayılan bir değerle başlatmadığım halde java yapılandırmalarımın neden başarısız olduğunu anlıyorum! Bu davranış değiştirilebilir mi? Teşekkürler :-)
funder7

3

Mikro hizmetimde aynı hatayı aldım, programda @Value ek açıklamasını ( ör. @Value) ("$ {project.api.key}") beyan ettiğinizde

aynı değerlere sahip application.properties dosyanızın boş olmamasına dikkat edin project.api.key = bazı değerler ekleyin

MostIMP : aksi takdirde "'ServiceFTP' adıyla fasulye oluşturulurken hata oluştu: Otomatik kablolu bağımlılıkların yerleştirilmesi" hatası verir.


0

Spring Boot ile:

Pom.xml'de

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <addResources>true</addResources>
            </configuration>
        </plugin>
    </plugins>
</build>

Java sınıfındaki örnek

@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;
    }
    [ ... ]

Özellikler dosyalarında:

src / main / kaynaklar / application.properties

foo=all-env-foo

src / main / kaynaklar / application-rec.properties

bar=rec-bar

src / main / kaynaklar / application-prod.properties

bar=prod-bar

Application.java'nın VM argümanlarında

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

Özellikleri değiştirdikten sonra mvn komutunu çalıştırmayı unutmayın!

mvn clean package -Dmaven.test.skip=true

-Dspring.profiles.active = rec için günlük dosyasında:

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

-Dspring.profiles.active = prod için günlük dosyasında:

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

-Dspring.profiles.active = local için günlük dosyasında:

Could not resolve placeholder 'bar' in value "${bar}"

Oups, application-local.properties oluşturmayı unuttum.


0

Mikro hizmet projemde de aynı hatayı aldım. Yml dosyamda mülkün kendisi eksik.Bu yüzden sorunumu çözen özellik adı ve değeri ekledim


0

Bu hata, yay projesinin dosya özelliklerini ( bootstrap.yml veya application.yml ) okumaması nedeniyle ortaya çıkar . Bunu çözmek için pom.xml dosyanıza bağımlılık eklemelisiniz.

   <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-context</artifactId>
    </dependency>

0

IntelliJ IDEA kullanılarak bulunamayan bazı özel özelliklerde bu sorunla sık sık karşılaşıyorum - muhtemelen dalları değiştirdikten sonra .

Benim durumumda ne yardımcı olur

Dosya -> Önbellekleri Geçersiz Kıl / Yeniden Başlat

Bunun bir IDE sorunundan daha büyük olasılıkla bir Gradle önbelleğe alma sorunu olduğunu varsaymıştım , ancak ./gradle clean yardımcı olmadı



-3

Benim çözümüm, $ ve {arasına bir boşluk eklemekti.

Örneğin:

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

olur

@Value("$ {project.ftp.adresse}")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.