2017-07-25 53 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