如何为数据库连接创建不同的类

时间:2017-07-25 09:23:54

标签: java spring spring-boot datasource

我正在开发一个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创建名称时出错。感谢

完整堆栈跟踪Stacktrace

Updated Stack trace

说明

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'

3 个答案:

答案 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);
}

或者无论您的实施是什么。