2016-01-14 15 views
5

Tôi mới làm quen với Spring-Batch (và Spring nói chung) và đã theo dõi tài liệu hướng dẫn để tự mình dạy những gì tôi cần làm. Tôi đang cố kết nối với cơ sở dữ liệu DB2.Tôi nhận được DataSource không được hỗ trợ khi sử dụng DataSouceBuilder

Nếu tôi khai báo kết nối DB2 với XML như thế này:

<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> 

Sau đó tải nó trong mã của tôi như vậy:

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

Nó hoạt động một cách hoàn hảo. Bao giờ tôi muốn sử dụng DataSourceBuilder như các ví dụ hiển thị vì vậy cuối cùng tôi muốn nhận được để:

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

Nhưng vì một lý do nào đó không hoạt động. Tôi nhận được

Nguyên nhân: java.lang.IllegalStateException: Không hỗ trợ kiểu DataSource tìm thấy

Tôi cũng đã cố gắng:

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

Và tôi nhận được lỗi tương tự. Nếu tôi chạy nó trong trình gỡ lỗi, tôi có thể thấy rằng lỗi xảy ra trên .build().

Tôi chắc chắn rằng tôi thiếu điều gì đó dễ dàng, nhưng tôi không thể tìm ra.

+4

Trước hết, 'build' trả về' DataSource' và đây phải là kiểu bạn trả về, không đưa nó vào 'DriverManagerDataSource' vì điều đó sẽ thất bại. Để sử dụng 'DataSourceBuilder', bạn cần có' commons-dbcp', hoặc 'tomcat-jdbc' hoặc' hikaricp' trên classpath của bạn nếu không nó sẽ không hoạt động. Tôi không có một trong số đó, bạn sẽ nhận được tin nhắn như bạn nhận được. Một điều bạn có thực sự cần một không gian tên tùy chỉnh ('DEV.datasource') tại sao không chỉ đơn giản là sử dụng mặc định? –

+0

Không gian tên sẽ là vì sẽ có nhiều nguồn dữ liệu. Đây là tài liệu tôi đã theo dõi cho điều đó là: https://docs.spring.io/spring-boot/docs/current/reference/html/howto-data-access.html Tôi đã thử nó mà không cần và với DriverManagerDataSource với cùng kết quả. Có một cách khác tôi đã nhìn mà sử dụng mà Vì vậy, tôi đã thử nó (đã được nắm bắt cho ống hút vào thời điểm đó), nhưng nó đã không giúp đỡ. Tôi đã xóa nó kể từ khi đăng bài này. NHƯNG việc thêm commons-dbcp vào các phụ thuộc của tôi đã hoạt động! Cảm ơn! – VydorScope

Trả lời

10

M. Deinum đã trả lời. Tôi đã thiếu commons-dbcp từ các phụ thuộc của tôi! Tôi nghĩ đó là điều dễ dàng như thế.

Để sử dụng DataSourceBuilder bạn cần phải có commons-DBCP, hoặc tomcat-jdbc hoặc hikaricp trên classpath của bạn nếu không nó sẽ không hoạt động. Tôi bạn không có một trong số đó bạn sẽ nhận được thông báo khi bạn nhận được.

Các vấn đề liên quan