2010-10-09 13 views
7

Mam aplikację Spring (Spring Batch not web application). W klasie testowej chcę uzyskać dostęp do wszystkich moich fasoli danego typu.
Rozumiem, że wiosną powinieneś używać IOC i pozwolić pojemnikowi wstrzyknąć fasolę. Jednak w tym przypadku chcę przechodzić przez zmienną liczbę ziaren rozszerzających daną klasę (org.springframework.batch.item.database.JdbcCursorItemReader) i robić coś (chcę, żeby był to test jednostki/integracji, który po prostu łączy się do bazy danych i odczytuje 1 wiersz, więc możemy w czasie testu potwierdzić, że wszystkie JdbcCursorItemReader w systemie mają poprawne mapowania SQL i wierszy).Uzyskaj dostęp do wszystkich fasoli szparagowych danego typu.

Problem 1) Mogę zdobyć tylko jedną fasolę na raz. Mogę mieć moją klasę implementującą BeanFactoryAware, aby uzyskać odniesienie do mojej fasolki. Następnie mogę wykonać beanFactory.getBean ("name");, aby uzyskać dostęp do pojedynczego komponentu. Jak zamiast tego otrzymam WSZYSTKIE ziarna? Potrafię przeglądać i upuszczać te, które nie są klasą, której chcę .. ale jakoś potrzebuję listy wszystkich fasoli, o których wie, czy czegoś takiego.

Problem 2) Ziarno, które otrzymuję z fasoli, jest proxy. Gdy próbuję rzucić i używać mojego fasoli uzyskać coś podobnego java.lang.ClassCastException: $ Proxy0 nie mogą być oddane do org.springframework.batch.item.database.JdbcCursorItemReader

Odpowiedz

11

można ominąć pierwszego problemu za pomocą ApplicationContextAware zamiast . To przejdzie w ApplicationContext, który ma metodę getBeansOfType(), która pozwala pobrać wszystkie ziarna, które są danego typu.

Drugi problem jest prawdopodobnie spowodowany tym, że coś tworzy proxy AOP wokół twojej fasoli JdbcCursorItemReader. Te generowane proxy domyślnie implementują te same interfejsy, co JdbcCursorItemReader (w szczególności: ItemReader i ItemStream). Twój kod nie powinien próbować rzutować na typ klasy (JdbcCursorItemReader), ale na jeden z tych typów interfejsu. Zwykle można zmusić serwer proxy do bezpośredniego rozszerzenia klasy, ale nie wiedząc nic o twojej konfiguracji, nie mogę ci w tym pomóc.

+0

Czy mogę przesłać go do ItemReader i po prostu go użyć? A magia proxy zapewni mi prawdziwego czytelnika? Źródło HummMY jest czasami skomplikowane. – bwawok

+1

@bwawok: Tak, przesyłanie do 'ItemReader' powinno działać dobrze. Po prostu nie próbuj rzutować na 'JdbcCursorItemReader'. – skaffman

+0

@skaffman: ale co jeśli muszę zrobić coś takiego ((JdbcCursorItemReader) itemReader) .open (executionContext); –

Powiązane problemy