Spring Boot无法从属性文件中读取

时间:2016-05-10 16:47:30

标签: java spring spring-boot

我在网上尝试了所有选项,但无法在以下方法中设置值:

@Configuration
@PropertySource("classpath:application.properties")
public class MyDataSource {
    @Value("${db.driver}") 
    private String DB_DRIVER;

    @Value("${db.url}")
    private String DB_URL;

    @Value("${db.username}")
    private String DB_USERNAME;

    @Value("${db.password}")
    private String DB_PASSWORD;


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

    @Bean
    public DataSource getDataSource() {
         DriverManagerDataSource dataSource = new DriverManagerDataSource();
         dataSource.setDriverClassName(DB_DRIVER);
         dataSource.setUrl(DB_URL);
         dataSource.setUsername(DB_USERNAME);
         dataSource.setPassword(DB_PASSWORD);

         return dataSource;
     }
}

我的application.properties位于main/resources文件夹中,可以在调试模式下的变量中看到值。但在运行应用时,会显示Property ' ' must not be empty.

编辑:我不确定第一种情况会出现什么问题? 因此,按照建议和代码更改了application.property文件:

@Autowired
protected JdbcTemplate jdbcTemp;

public List<> getData(String id) {

    return jdbcTemp.query("SELECT ........,new RowMapper());
}

但是得到了java.lang.NullPointerException:

3 个答案:

答案 0 :(得分:5)

如果您使用的是Spring Boot,则可以通过声明一些条目来利用application.properties文件:

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass

这样就不需要在Spring Boot中实现@Configuration类来设置数据库连接。

你可以在这里加深: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html

顺便说一句,看看spring.io

答案 1 :(得分:1)

对于java配置,使用Environment实例获取属性似乎是首选方法,因为默认情况下${..}占位符未解析。

您可以使用以下内容:

@Autowired
private Environment env;

@Bean
public DataSource getDataSource() {
     DriverManagerDataSource dataSource = new DriverManagerDataSource();
     dataSource.setDriverClassName(env.getProperty("db.driver");

     .....

     return dataSource;
 }

Spring Jira

的原因
  
      
  1. 它不一致。 @PropertySource是ConfigurableEnvironment#addPropertySource的声明性对应物。我们不添加   PropertySourcesPlaceholderConfigurer在后一种情况下,它会   在前者中这样做是不一致的。它不会是用户   适用于所有(甚至大多数)案例。
  2.   
  3. 完全有可能,甚至建议@Configuration类用户完全放弃$ {...}财产替换,赞成   环境#getProperty在@Bean方法中查找。对于用户   按照这个建议,自动注册一个   注意到PropertySorucesPlaceholderConfigurer会让人感到困惑,   并且通常是不受欢迎的,因为它是一个更活跃的部分。是的,它就是   存在是良性的,但不是免费的。 PSPC必须访问每个bean   在容器中定义询问PropertyValues,只做   没有用户使用的情况   环境#getProperty方法。
  4.   
  5. 它可以通过文档解决(并已经解决)。正确使用@PropertySource,PropertySourcesPlaceholderConfigurer等   组件在Javadoc中非常全面地记录   @Configuration已经很快就会出现参考文档。
  6.   

答案 2 :(得分:-1)

当我尝试从MySQL切换到MSSQL时,我也遇到了错误。实际的问题是我忘记将MSSQL依赖项放入服务中。我用mssql-jdbc