我在网上尝试了所有选项,但无法在以下方法中设置值:
@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.
@Autowired
protected JdbcTemplate jdbcTemp;
public List<> getData(String id) {
return jdbcTemp.query("SELECT ........,new RowMapper());
}
但是得到了java.lang.NullPointerException:
答案 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;
}
的原因
- 它不一致。 @PropertySource是ConfigurableEnvironment#addPropertySource的声明性对应物。我们不添加 PropertySourcesPlaceholderConfigurer在后一种情况下,它会 在前者中这样做是不一致的。它不会是用户 适用于所有(甚至大多数)案例。
- 完全有可能,甚至建议@Configuration类用户完全放弃$ {...}财产替换,赞成 环境#getProperty在@Bean方法中查找。对于用户 按照这个建议,自动注册一个 注意到PropertySorucesPlaceholderConfigurer会让人感到困惑, 并且通常是不受欢迎的,因为它是一个更活跃的部分。是的,它就是 存在是良性的,但不是免费的。 PSPC必须访问每个bean 在容器中定义询问PropertyValues,只做 没有用户使用的情况 环境#getProperty方法。
- 它可以通过文档解决(并已经解决)。正确使用@PropertySource,PropertySourcesPlaceholderConfigurer等 组件在Javadoc中非常全面地记录 @Configuration已经很快就会出现参考文档。
醇>
答案 2 :(得分:-1)
当我尝试从MySQL切换到MSSQL时,我也遇到了错误。实际的问题是我忘记将MSSQL依赖项放入服务中。我用mssql-jdbc