英文:
Bind properties in application.yml not working
问题
你的问题是关于SpringBoot项目中绑定application.yml
文件中的属性到Java类时出现了问题。错误信息指出driverClassName
属性为空,因此绑定失败。以下是你可能遗漏的一些问题:
-
确保
application.yml
中的属性命名和Java类中的属性命名一致,包括大小写。 -
确保
DBConfig
类上的@ConfigurationProperties
注解引用的前缀与application.yml
中的前缀一致。在你的代码中,前缀是"spring.datasource"
。 -
检查
application.yml
文件是否正确放置在src/main/resources/
目录下。 -
确保项目的依赖项正确配置,包括Spring Boot Starter和SQLite数据库驱动。
-
如果你在
application.yml
中使用了敏感字符,例如"
,请确保它们被正确解析为双引号。 -
确保
DBConfig
类被Spring Boot正确扫描并成为应用程序上下文的一部分。
最后,确保SQLite在Spring Boot中的配置是正确的,因为它可能需要特定的配置和依赖项来正确运行。如果SQLite在Spring Boot中的支持不够好,你可能需要手动配置数据源,就像你在DBConfig
中所做的那样。
英文:
In my SpringBoot project I have application.yml file in src/main/resources/:
server:
port: 8080
spring:
datasource:
driver-class-name: org.sqlite.JDBC
...
I want to bind the properties defined above to a Java class:
@Configuration
@ConfigurationProperties(prefix = "spring.datasource")
public class DBConfig {
// I wished spring-boot could automatically bind it with 'driver-class-name' in application.yml
private String driverClassName;
...
@Bean
public DataSource dataSource() {
final DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(driverClassName);
...
return dataSource;
}
}
I have the annotation @Configuration
and @ConfigurationProperties(prefix = "spring.datasource")
. I also have specified the correct prefix. But when I run my application I get an error:
> Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [com/my/webapp/config/DBConfig.class]: Failed to instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw exception with message: Property 'driverClassName' must not be empty
The error tells driverClassName
is an empty string, so the binding doesn't work. What am I missing? I am using an SQLite database which is not as well supported as MySQL, MariaDB, etc. in SpringBoot. So I provide a datasource bean class to bind database configurations in application.yml to the manually created bean class. Is it unnecessary?
答案1
得分: 0
通常配置属性的常规方式是将它们保存在单独的类中,并使用 @EnableConfigurationProperties
来激活它们。您可以阅读这篇文章。您可以尝试以下内容:
@Configuration
@EnableConfigurationProperties(MyConfigurationProperties.class)
public class DBConfig {
@Autowired
private MyConfigurationProperties props;
@Bean
public DataSource dataSource() {
final DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(props.getDriverClassName());
// ...
return dataSource;
}
}
而您的属性类将如下所示:
@ConfigurationProperties(prefix = "spring.datasource")
public class MyConfigurationProperties {
private String driverClassName;
// 这里有getter和setter方法
}
但我不确定这是否是最佳解决方案,因为Spring已经有了自己的配置属性类,它绑定到前缀 spring.datasource
。
第二个选项是使用Spring配置属性:
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
// ...
@Configuration
@EnableConfigurationProperties(DataSourceProperties.class)
public class DBConfig {
@Autowired
private DataSourceProperties props;
@Bean
public DataSource dataSource() {
final DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(props.getDriverClassName());
// ...
return dataSource;
}
}
英文:
The usual way for configuration properties is to keep them in the separate class and activate them using @EnableConfigurationProperties
. You can read this article. And you can try something as follows:
@Configuration
@EnableConfigurationProperties(MyConfigurationProperties.class)
public class DBConfig {
@Autowired
private MyConfigurationProperties props;
@Bean
public DataSource dataSource() {
final DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(props.getDriverClassName());
// ...
return dataSource;
}
}
And your properties class will look like this:
@ConfigurationProperties(prefix = "spring.datasource")
public class MyConfigurationProperties {
private String driverClassName;
// getters ans setters are here
}
But I'm not sure if this is the best solution, because Spring already has its own configuration properties class that binds to the prefix spring.datasource
.
And the second option for you is to use the Spring configuration properties:
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
// ...
@Configuration
@EnableConfigurationProperties(DataSourceProperties.class)
public class DBConfig {
@Autowired
private DataSourceProperties props;
@Bean
public DataSource dataSource() {
final DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(props.getDriverClassName());
// ...
return dataSource;
}
}
答案2
得分: 0
你只需要为你的 DBConfig
类中的字段添加设置器,它就会正常工作。
英文:
You only need to add setters for feilds in your DBConfig
class and it will work.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论