我正在开发一个spring boot应用程序,我需要一个公共类为我提供所有控制器的数据库连接所以我创建了一个sepeate类如下所示:
@RestController
public class DataBaseConnector{
@Autowired
@Qualifier("dataSource")
public static DataSource dataSource;
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.ds")
public DataSource DataSourcePGStreet() {
return DataSourceBuilder.create().build();
}
@Autowired
public Connection giveConnection() throws SQLException{
return dataSource.getConnection();
}
}
然后在另一个Controller中,我按如下方式调用连接:
@Autowired
@Qualifier("dbc")
private static DataBaseConnector obj;
@Autowired
private Connection connectionDatabase;
.../// Rest Code
@RequestMapping(value="/path",produces={MediaType.APPLICATION_JSON_VALUE},method=RequestMethod.GET)
public ResponseEntity<?> getStreetScore(){
obj=new DataBaseConnector();
connectionDatabase=obj.giveConnection();
}
但这会引发我的错误
使用DataBaseConnector创建名称时出错。感谢
说明
Field dataSource in com.dmmltasmu.controller.DataBaseConnector required a bean of type 'javax.sql.DataSource' that could not be found.
- Bean method 'dataSource' not loaded because @ConditionalOnClass did not find required class 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType'
- Bean method 'dataSource' not loaded because @ConditionalOnClass did not find required classes 'javax.transaction.TransactionManager', 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType'
答案 0 :(得分:4)
您无法自动装配静态字段。丑陋,但如果你想尝试低于一个
@Component
public class AnotherController {
private static DataBaseConnectionProvider obj;
@Autowired
public void setDataBaseConnectionProvider(DataBaseConnectionProvider obj) {
AnotherController.obj = obj;
}}
答案 1 :(得分:2)
你使用静态
@Autowired
@Qualifier("dataSource")
public static DataSource dataSource;
Spring无法自动装配static
。删除static
您可以尝试通过方法自动装配并向静态设置,但这是非常糟糕的方法。
中的相同内容
@Autowired
@Qualifier("dbc")
private static DataBaseConnector obj;
删除静态。
BTW java命名约定假设方法名称从小写开始。纠正
DataSourcePGStreet
答案 2 :(得分:1)
请勿尝试注入会导致错误且难以调试问题的Connection
。只需使用JdbcTemplate
进行JDBC访问就不会让你的生活变得更难。
@Autowired
字段旁边的static
旁边不起作用,您只能注入非static
字段。
假设您已相应地配置了spring.datasource
个属性(如果不将spring.ds
属性重命名为spring.datasource
),那么Spring会自动配置DataSource
和{{3} }。
从您的代码判断,只需删除您的DataBaseConnector
。
使用JdbcTemplate
只是注入它。
@Autowired
private JdbcTemplate jdbc;
@RequestMapping(value="/path",produces={MediaType.APPLICATION_JSON_VALUE},method=RequestMethod.GET)
public ResponseEntity<?> getStreetScore(){
Obj result = jdbc.queryForObject(<your-query>, new RowMapper() { ... });
return ResponseEntity.ok(result);
}
或者无论您的实施是什么。