2010-10-09 6 views
7

Tôi có một ứng dụng Spring (Spring Batch không phải ứng dụng web). Trong một lớp thử nghiệm, tôi muốn lấy quyền truy cập vào tất cả các hạt đậu của tôi thuộc một loại nhất định.

Tôi hiểu rằng trong mùa xuân, bạn thường nên sử dụng IOC và để cho thùng chứa tiêm đậu của bạn. Tuy nhiên, trong trường hợp này, tôi muốn lặp qua một số lượng biến có thể mở rộng một lớp đã cho (org.springframework.batch.item.database.JdbcCursorItemReader), và làm một cái gì đó (muốn nó là một bài kiểm tra đơn vị/tích hợp mà chỉ cần kết nối nó vào cơ sở dữ liệu và đọc 1 hàng, vì vậy chúng tôi có thể xác nhận tại thời điểm thử nghiệm rằng tất cả JdbcCursorItemReader trong hệ thống có các trình ánh xạ SQL và hàng hợp lệ).Truy cập vào tất cả các hạt đậu mùa xuân thuộc một loại nhất định

Sự cố 1) Tôi chỉ có thể nhận đậu mỗi lần một. Tôi có thể có lớp học của tôi thực hiện BeanFactoryAware để có được một tham chiếu đến beanfactory của tôi. Sau đó, tôi có thể làm beanFactory.getBean ("name"); để có quyền truy cập vào một bean đơn. Làm thế nào để tôi có được TẤT CẢ đậu? Tôi có thể lặp lại và thả những cái mà không phải là lớp tôi muốn .. nhưng bằng cách nào đó tôi cần một danh sách tất cả các bean beanfactory biết về hoặc một cái gì đó.

Vấn đề 2) Đậu tôi nhận được từ beanfactory là proxy. Nếu tôi cố gắng đúc và sử dụng đậu của tôi, tôi có được một cái gì đó giống như java.lang.ClassCastException: $ Proxy0 không thể được đúc để org.springframework.batch.item.database.JdbcCursorItemReader

Trả lời

11

Bạn có thể khắc phục vấn đề đầu tiên bằng cách sử dụng ApplicationContextAware thay vì BeanFactoryAware. Điều này sẽ vượt qua trong các ApplicationContext, trong đó có các phương pháp getBeansOfType() cho phép bạn lấy tất cả các hạt cà phê của một loại nhất định.

Vấn đề thứ hai có thể gây ra bởi vì có điều gì đó đang tạo proxy AOP xung quanh hạt JdbcCursorItemReader của bạn. Theo mặc định, các proxy được tạo này sẽ triển khai cùng một giao diện mà JdbcCursorItemReader thực hiện (cụ thể là ItemReaderItemStream). Mã của bạn không nên thử và truyền sang loại lớp (JdbcCursorItemReader), nhưng thay vào đó, đối với một trong các loại giao diện đó. Nó thường có thể buộc proxy mở rộng lớp proxy trực tiếp, nhưng không biết gì về thiết lập của bạn, tôi không thể giúp bạn với điều đó.

+0

Tôi có thể truyền nó vào ItemReader và chỉ sử dụng nó? Và ma thuật proxy sẽ cho tôi người đọc thực sự? Hummmm mùa xuân là phức tạp đôi khi – bwawok

+1

@ bwawok: Có, đúc để 'ItemReader' sẽ làm việc tốt. Chỉ cần không thử và truyền tới 'JdbcCursorItemReader'. – skaffman

+0

@skaffman: nhưng nếu tôi phải làm điều gì đó như thế này ((JdbcCursorItemReader) itemReader) .open (executionContext); –