2016-01-14 18 views
5

Sono nuovo di Spring-Batch (e Spring in generale) e ho seguito la documentazione in linea per insegnare a me stesso cosa ho bisogno di svolgere questa attività. Sto cercando di connettermi a un database DB2.Ricevo DataSource non supportato quando si utilizza DataSouceBuilder

Se io dichiaro la connessione DB2 con XML come questo:

<bean id="wcs_dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.ibm.db2.jcc.DB2Driver" /> 
    <property name="url" value="jdbc:db2://127.0.0.1/DEV" /> 
    <property name="username" value="user" /> 
    <property name="password" value="pass5" /> 
</bean> 

quindi caricarlo nel mio codice in questo modo:

@Bean 
    public JdbcCursorItemReader<Product> databaseItemReader() {    
     ApplicationContext context = 
       new ClassPathXmlApplicationContext("context-datasource.xml"); 
     DataSource dataSource = (DataSource) context.getBean("wcs_dataSource"); 
     ((ConfigurableApplicationContext)context).close(); 

     JdbcCursorItemReader<Product> result = new JdbcCursorItemReader<Product>(); 
     result.setDataSource(dataSource); 
     result.setSql(sqlString); 
     result.setRowMapper(new ProductRowMapper()); 
     return result; 
    } 

Funziona perfettamente. Come mai Vorrei utilizzare il DataSourceBuilder come gli esempi mostrano quindi in ultima analisi, vorrei arrivare a:

@ConfigurationProperties(prefix="DEV.datasource") 
public DataSource Wcs_DataSource(){ 
    return DataSourceBuilder.create().build(); 
} 

Ma per qualche ragione che non funziona. Ottengo

Causato da: java.lang.IllegalStateException: No supportato tipo DataSource trovato

Ho anche provato:

public DriverManagerDataSource dataSource() {    
    DataSourceBuilder DSBuilder = DataSourceBuilder.create(); 
    DSBuilder.url("jdbc:db2://127.0.0.1/DEV"); 
    DSBuilder.username("user"); 
    DSBuilder.password("password"); 
    DSBuilder.driverClassName("com.ibm.db2.jcc.DB2Driver"); 
    DriverManagerDataSource result = (DriverManagerDataSource) DSBuilder.build(); 
    return result;  
} 

E ottengo lo stesso errore. Se lo eseguo nel debugger, posso vedere che l'errore si verifica su .build().

Sono sicuro che mi manca qualcosa di facile, ma non riesco a capirlo.

+4

Prima di tutto il 'build' restituisce un' DataSource' e questo dovrebbe essere il tipo che si restituisce, non trasmetterlo a un 'DriverManagerDataSource' dato che fallirà. Per usare 'DataSourceBuilder' è necessario avere' commons-dbcp', 'tomcat-jdbc' o' hikaricp' sul classpath altrimenti non funzionerà. Non hai uno di quelli che riceverai il messaggio non appena avrai ottenuto. Un'altra cosa è che hai davvero bisogno di uno spazio dei nomi personalizzato ('DEV.datasource') perché non utilizzare semplicemente l'impostazione predefinita? –

+0

Lo spazio dei nomi sarà perché ci sarà più di un'origine dati. Questa è la documentazione che stavo seguendo per questo: https://docs.spring.io/spring-boot/docs/current/reference/html/howto-data-access.html Ho provato senza e con DriverManagerDataSource con gli stessi risultati. C'era un altro howto che stavo osservando che usava quello. Così l'ho provato (a quel punto stavo afferrando le cannucce), ma non è stato d'aiuto. L'ho rimosso da quando ho postato questo. MA aggiungere commons-dbcp alle mie dipendenze ha funzionato! Grazie! – VydorScope

risposta

10

M. Deinum ha risposto. Mi mancava commons-dbcp dalle mie dipendenze! Ho pensato che fosse qualcosa di facile come quello.

Per utilizzare il DataSourceBuilder è necessario avere Commons-DBCP o tomcat-JDBC o hikaricp sul classpath altrimenti non funzionerà. Io tu non hai uno di quelli che riceverai il messaggio non appena avrai ricevuto.

Problemi correlati