2017-07-25 1 views
3

Je développe une application de démarrage de printemps et j'ai besoin d'une classe commune pour me fournir des connexions de base de données pour tous les contrôleurs Donc je crée une classe sepeate comme suit:Comment faire différentes classes pour les connexions 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(); 
     } 


} 

Ensuite, dans un autre contrôleur i appelle la connexion comme ci-dessous:

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



} 

Mais cela me renvoie une erreur de

création d'erreur de nom avec l'aide DataBaseConnector.Any est un ppreciated

Stack trace complète Stacktrace

Updated Stack trace

Description:

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

S'il vous plaît inclure le stacktrace complet – ChristofferPass

+0

@ChristofferPass ajouté plein stacktrace – Ricky

+0

Utilisez ce guide: https://medium.com/@joeclever/using-multiple-datasources-with-spring-boot-and-spring-data-6430b00c02e7 A travaillé pour moi. – elysrivero99

Répondre

4

Vous ne pouvez pas les champs statiques lier automatiquement. Laid, mais si vous voulez essayer ci-dessous un

@Component 
public class AnotherController { 

private static DataBaseConnectionProvider obj; 

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

J'ai enlevé statique mais toujours obtenir l'erreur.Voir l'erreur mise à jour – Ricky

2

Vous utilisez statique

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

printemps ne peut pas lier automatiquement static. Retirez le static

Vous pouvez essayer d'autowire par la méthode et asign à thee statiques mais c'est une approche terrible.

Le même dans le

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

Supprimer statique.

La convention de dénomination java BTW suppose que les noms de méthodes commencent en minuscules. Corriger le

DataSourcePGStreet 
+0

J'ai enlevé Statique mais toujours obtenir l'erreur.Voir l'erreur mise à jour – Ricky

1

Ne pas essayer d'injecter un Connection qui conduira à des erreurs et difficiles à des problèmes de débogage. Il suffit d'utiliser un JdbcTemplate pour faire l'accès JDBC ne pas vous rendre la vie plus difficile.

A côté de cela @Autowired sur static les champs ne fonctionneront pas, vous ne pouvez injecter que dans des champs non static.

En supposant que vous avez configuré vos spring.datasource propriétés en conséquence (sinon renommer vos spring.ds propriétés à spring.datasource) que le printemps de façon configurera automatiquement une DataSource et JdbcTemplate. À partir de votre code, supprimez simplement DataBaseConnector. Pour utiliser le JdbcTemplate il suffit de l'injecter.

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

Ou quelle que soit votre implémentation.

+0

Mais cela fonctionnera comme un pool de connexion.Parce que j'ai besoin de beaucoup de connexions plus tard – Ricky

+0

Cela dépend, votre 'DataSource' devrait être le pool de connexion, vous ne devez pas inventer le vôtre. Si votre datasource est une bonne implémentation alors oui, si vous attendez quelque chose comme 'DriverManagerDataSource' de Spring pour être un pool de connexion correct alors non car cela n'est pas implémenté comme un. –

+0

C'est pourquoi j'ai utilisé la méthode précédente où je crée une piscine et obtenir des connexions.Mais celui-ci je ne comprends pas.Si cela ne vous dérange pas pouvez-vous expalin un peu plus – Ricky