Я пытаюсь использовать свойства из .properties
файла, но, похоже, это не работает.
Вот мой код:
@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;
[...]
}
Этот класс использует @Value
аннотации для получения свойств. Он также объявлен как Spring Service и связан с моим 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>
С помощью context:property-placeholder
привязываю этот файл к своему context-core.properties
файлу:
project.ftp.adresse = localhost
project.ftp.login = anonymous
project.ftp.password =
project.ftp.root = /anonymous/
В этом есть смысл, правда?
Но когда я пытаюсь запустить свой проект, Tomcat выдает исключение:
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
Или, короче: java.lang.IllegalArgumentException: Could not resolve placeholder 'project.ftp.adresse' in string value "${project.ftp.adresse}"
РЕДАКТИРОВАТЬ :
Вот мой 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>
Мой InfraContext.xml импортируется в другой XML-файл с именем 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>
Я явно чего-то упускаю, но не могу понять, что именно.
Пожалуйста, дайте мне знать, если вам нужны подробности, это мой первый вопрос, я постараюсь ответить, как только смогу :).
infraContext.xml
грузят? Судя по трассировке стека, он не входит в конфигурацию, загружаемуюContextLoaderListener
. Разместите, пожалуйста, свой web.xml.PropertySourcesPlaceholderConfigurer
одного явно определенного (почему?) И одного из-за пространства имен. Тот, что у васapplicationContext.xml
, ничего не делает и ничего не добавляет. Убери это.Ответы:
В вашей конфигурации у вас есть 2
PropertySourcesPlaceholderConfigurer
экземпляра.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"/>
По умолчанию a
PlaceholderConfigurer
будет работать без сбоев, поэтому, если заполнитель не может быть разрешен, он выдаст исключение. Экземпляр изapplicationContext.xml
файла не имеет свойств и, как таковой, завершится ошибкой для всех заполнителей.Решение: удалите его из applicationContext.xml, поскольку он ничего не добавляет, а только ломает.
источник
PlaceholderConfigurer
?ignore-unresolved-placeholders
наtrue
.У меня была такая же проблема, решил ее, добавив
<filtering>true</filtering>
в pom.xml:
раньше (не работало):
после (это сработало):
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>
После этого вы просто запускаете mvn clean install and deploy application.
источник
Эта проблема возникает, если приложение не может получить доступ к файлу some_file_name.properties. Убедитесь, что весной файл свойств помещен в папку ресурсов.
Шаги по устранению неисправностей
1: Добавьте файл свойств в папку ресурсов.
2: Если у вас нет папки ресурсов. Создайте его, перейдя по новому, щелкнув правой кнопкой мыши проект новый> Исходная папка, назовите его как ресурс и поместите под него файл свойств.
Для реализации на основе аннотаций
Добавить
@PropertySource(ignoreResourceNotFound = true, value = "classpath:some_file_name.properties")
// Добавить перед использованием заполнителяПример:
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; } }
assignment1.properties
источник
В моем случае я был неосторожен при слиянии файла application.yml, и я излишне сдвинул свои свойства вправо.
Я сделал это так:
В то время как код ожидал, что это будет так:
источник
Вы также можете попробовать значения по умолчанию. аннотация весеннего значения
Значения по умолчанию могут быть предоставлены для свойств, которые могут быть не определены. В этом примере будет введено значение «some default»:
@Value("${unknown.param:some default}") private String someDefault;
Если одно и то же свойство определено как системное свойство и в файле свойств, то будет применено системное свойство.
источник
У меня такая же ошибка в моем микросервисе, когда вы объявляете аннотацию @Value в программе, например @Value ("$ {project.api.key}")
убедитесь, что ваш файл application.properties с такими же значениями не должен быть пустым project.api.key = добавить некоторые значения
MostIMP : в противном случае будет выдана ошибка «Ошибка при создании bean-компонента с именем 'ServiceFTP': внедрение зависимостей с автоматическим подключением»
источник
С Spring Boot:
В pom.xml
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <addResources>true</addResources> </configuration> </plugin> </plugins> </build>
Пример в классе 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; } [ ... ]
В файлах свойств:
SRC / основные / ресурсы / application.properties
SRC / основные / ресурсы / application-rec.properties
SRC / основные / ресурсы / application-prod.properties
В аргументах виртуальной машины Application.java
Не забудьте запустить команду mvn после изменения свойств!
mvn clean package -Dmaven.test.skip=true
В файле журнала для -Dspring.profiles.active = rec:
В файле журнала для -Dspring.profiles.active = prod:
В файле журнала для -Dspring.profiles.active = local:
Could not resolve placeholder 'bar' in value "${bar}"
Упс, я забыл создать application-local.properties.
источник
У меня такая же ошибка в моем проекте микросервиса. Само свойство отсутствует в моем yml-файле, поэтому я добавил имя свойства и значение, которое решает мою проблему.
источник
Эта ошибка возникает из-за того, что проект spring не читает свойства файла ( bootstrap.yml или application.yml ). Чтобы решить эту проблему, вы должны добавить зависимость в свой pom.xml
источник
Эту ошибку может вызвать удаление или повреждение файла pom.xml.
источник
Мое решение заключалось в том, чтобы добавить пробел между $ и {.
Например:
@Value("${project.ftp.adresse}")
становится
@Value("$ {project.ftp.adresse}")
источник