在spring框架中使用注释读取属性文件

时间:2017-04-16 05:29:04

标签: java spring spring-boot

当我在spring framework中读取带有注释的属性文件时,我遇到了问题。我尝试使用xml的相同程序,它的工作正常,但问题是我检查文件在类路径中可用,它给出了false.the代码如下。我的例外是

 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'appConfigMongoDB': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: public java.lang.String gettingValueFromResourcePropFile.AppConfigMongoDB.name; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'jdbc.driverClassName' in string value "${jdbc.driverClassName}"
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1202)

代码是:

package gettingValueFromResourcePropFile;


@Configuration
@ComponentScan
@PropertySource("classpath:db.properties")
public class SpringConfiguration {

    public SpringConfiguration(){
        super();
    }

  @Bean
  public static PreferencesPlaceholderConfigurer propertyConfigInDev() {
    return new PreferencesPlaceholderConfigurer();
  }

}


@Configuration
@PropertySource("classpath:db.properties")
public class AppConfigMongoDB { 

    @Value(value="${jdbc.driverClassName}")
    public String name;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

 }


public class MainContainer {

    public static void main(String[] args) 
    {


        URL url = ClassLoader.getSystemResource("db.properties");

        final File file = new File(url.getFile());
        System.out.println(file.exists());
        System.out.println(file.getAbsolutePath());


        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfiguration.class);
        AppConfigMongoDB mongo = applicationContext.getBean(AppConfigMongoDB.class);
       System.out.println("== ==" + mongo.getName() ); 


    }

}

我的属性文件在src中可用,问题是我无法读取属性文件(prop文件包含以下属性)

db.properties文件

jdbc.driverClassName=org.hsqldb.jdbcDriver 
jdbc.url=jdbc:hsqldb:hsql://production:9002
jdbc.username=sa
jdbc.password=root

2 个答案:

答案 0 :(得分:0)

  

我的属性文件在src中可用

我认为您需要将db.properties文件放在<project_home>/src/main/resources下,这是大多数Java构建工具的classpath资源。

答案 1 :(得分:0)

定义单个属性文件

@Configuration
@PropertySource("classpath:default.properties")
public class RestAPIURLConfig { … }

@Configuration
@PropertySource(value="classpath:default.properties")
public class RestAPIURLConfig { … }

@Configuration
@PropertySource(value={"file://D:/SpringExamples/default.properties"})
public class RestAPIURLConfig {}

当我们使用“classpath”定义属性文件时,如上例所示,它会在项目类路径中搜索该文件并解析所有值。

定义多个属性文件

@Configuration
@PropertySource(value={"classpath:default.properties","classpath:config.properties"})
public class RestAPIURLConfig {}

注:

当我们使用@PropertySource注释定义多个属性文件时,这些文件的顺序非常重要。例如,以上面的例子为例。如果我们在default.properties和config.properties文件中定义相同的属性(键值)对,则config.properties会覆盖default.properties值。

所以项目结构如下所示:

enter image description here

资源链接:

this tutorial中描述了一步一步的完整示例。