Spring无法解析占位符

时间:2015-02-03 19:34:01

标签: java spring

如果这是一个愚蠢的问题,我很高兴春天,请原谅我。当我尝试启动程序时,出现以下错误:java.lang.IllegalArgumentException: Could not resolve placeholder 'appclient' in string value [${appclient}]。执行以下代码时抛出错误:

package ca.virology.lib2.common.config.spring.properties;
import ca.virology.lib2.config.spring.PropertiesConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;

@Configuration
@Import({PropertiesConfig.class})
@PropertySource("${appclient}")
public class AppClientProperties {
private static final Logger log = LoggerFactory.getLogger(AppClientProperties.class);
{
    //this initializer block will execute when an instance of this class is created by Spring
    log.info("Loading AppClientProperties");
}
@Value("${appclient.port:}")
private int appClientPort;

@Value("${appclient.host:}")
private String appClientHost;

public int getAppClientPort() {
    return appClientPort;
}

public String getAppClientHost() {
    return appClientHost;
}
}

资源文件夹中存在一个名为appclient.properties的属性文件,其中包含主机和端口的信息。我不确定"${appclient}"的定义在哪里,如果有的话。也许它甚至没有定义,这导致了问题。我是否需要将"${appclient}"更改为"{classpath:/appclient.properties}"或我错过了其他内容?

8 个答案:

答案 0 :(得分:16)

您没有正确阅读属性文件。 propertySource应将参数传递为:file:appclient.propertiesclasspath:appclient.properties。将注释更改为:

@PropertySource(value={"classpath:appclient.properties"})

但是我不知道你的PropertiesConfig文件包含什么,因为你也导入了它。理想情况下,@PropertySource注释应保留在那里。

答案 1 :(得分:11)

如果您使用的是Spring 3.1及更高版本,则可以使用类似......

的内容
@Configuration
@PropertySource("classpath:foo.properties")
public class PropertiesWithJavaConfig {

@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
  return new PropertySourcesPlaceholderConfigurer();
}
}

您也可以使用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:foo.properties" />

  </beans>

在早期版本中。

答案 2 :(得分:1)

我的解决方案是在$和{之间添加一个空格。

例如:

@Value("${appclient.port:}")

成为

@Value("$ {appclient.port:}")

答案 3 :(得分:0)

对于需要在WAR之外管理的属性:

<context:property-placeholder location="file:///C:/application.yml"/>

例如,如果在application.yml中有nameid

然后你可以在xml spring中的运行时创建bean

<bean id="id1" class="my.class.Item">
    <property name="name" value="${name}"/>
    <property name="id" value="${id}"/>
</bean>

答案 4 :(得分:0)

如果配置文件所在的路径与类路径不同,则可以将配置文件路径添加为系统属性:

java -Dapp.config.path=path_to_config_file -jar your.jar

答案 5 :(得分:0)

希望仍然有用,application.properties(或application.yml)文件必须位于以下两个路径中:

  • src / main / resource / config
  • src / test / resource / config

包含您要引用的相同属性

答案 6 :(得分:0)

enter image description here我知道这是一条旧消息,但我想添加我的案子。

如果您使用多个配置文件(开发,测试,产品...),请检查您的执行配置文件。

答案 7 :(得分:0)

在我的情况下,生成的war文件没有获取属性文件,因此不得不再次在IntelliJ编辑器中进行全新安装。