2017-07-25 59 views
3

我开发一个春天启动应用程序,我需要一个共同的类为我提供数据库连接所有控制器所以我创建如下一个sepeate类:如何使不同类DB连接

@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(); 
     } 


} 

然后在另一个控制器I拨打下面的连接:

@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.Any帮助的错误是ppreciated

完整堆栈跟踪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' 
+2

请包括完整的堆栈跟踪 – ChristofferPass

+0

@ChristofferPass添加了完整的堆栈跟踪 – Ricky

+0

使用本指南:https://medium.com/@joeclever/using-multiple-datasources-with-spring-boot-and-spring-data-6430b00c02e7 为我工作。 – elysrivero99

回答

4

不能自动装配的静态字段。丑陋的,但如果你想尝试下面的一个

@Component 
public class AnotherController { 

private static DataBaseConnectionProvider obj; 

@Autowired 
public void setDataBaseConnectionProvider(DataBaseConnectionProvider obj) { 
    AnotherController.obj = obj; 
}} 
+0

我删除了静态但仍然收到错误。请参阅更新错误 – Ricky

2

@Autowired 
@Qualifier("dataSource") 
public static DataSource dataSource; 

春天不能自动装配static使用静态。删除static

你可以尝试通过方法自动装配,并为你静态,但这是可怕的方法。

同样在

@Autowired 
@Qualifier("dbc") 
private static DataBaseConnector obj; 

消除静电。

顺便说一句,Java命名约定假设方法名称从小写开始。更正

DataSourcePGStreet 
+0

我删除静态但仍然得到错误。请参阅更新错误 – Ricky

1

不要试图注入Connection,这将导致错误和难以调试的问题。只需使用JdbcTemplate来做JDBC访问就不会让你的生活变得更难。

在该@Autowired旁边static字段将不起作用,您只能注入非static字段。

假设你已经相应地配置您的spring.datasource属性(如果不是你spring.ds属性重命名为spring.datasource)春这样会自动配置DataSourceJdbcTemplate

从您的代码判断删除您的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); 
} 

或无论您的实施是什么。

+0

但是,这将作为连接池工作。因为我可能需要大量的连接后来 – Ricky

+0

这取决于,你的'DataSource'应该是连接池,你不应该发明自己的。如果你的数据源是一个正确的实现,那么是的,如果你希望Spring的'DriverManagerDataSource'这样的东西成为一个适当的连接池,那么没有,因为它不是作为一个实现的。 –

+0

这就是为什么我使用早先的方法,我创建一个池并获得连接。但这一个我没有得到它。如果你不介意可以expalin更多 – Ricky