2010-10-09 18 views
7

Ich habe eine Spring-Anwendung (Spring Batch nicht Web-Anwendung). In einer Testklasse möchte ich Zugriff auf alle meine Beans eines bestimmten Typs haben.

Ich verstehe, dass im Frühjahr sollten Sie in der Regel IOC verwenden und lassen Sie den Container Ihre Bohnen injizieren. In diesem Fall möchte ich jedoch eine variable Anzahl von Beans durchlaufen, die eine bestimmte Klasse erweitern (org.springframework.batch.item.database.JdbcCursorItemReader), und etwas tun (möchte, dass es sich um einen Einheits-/Integrationstest handelt, der nur eine Verbindung herstellt es auf die Datenbank und liest 1 Reihe, also können wir zur Testzeit bestätigen, dass alle JdbcCursorItemReader im System gültige SQL- und Reihe Mapper haben).Zugriff auf alle Frühlingsbohnen eines bestimmten Typs

Problem 1) Ich kann nur Bohnen einzeln bekommen. Ich kann meine Klasse BeanFactoryAware implementieren, um einen Verweis auf meine BeanFactory zu erhalten. Dann kann ich tun BeanFactory.getBean ("Name"); Zugriff auf eine einzelne Bean erhalten. Wie bekomme ich stattdessen ALLE Beans? Ich kann die, die nicht die Klasse sind, die ich möchte, durchschleifen und löschen. Aber irgendwie brauche ich eine Liste aller Beans, von denen die Beanfactory weiß oder so etwas.

Problem 2) Die Bohne, die ich von der Beanfactory zurückbekomme, ist ein Proxy. Wenn ich versuche, meine Bohne zu werfen und verwende ich so etwas wie java.lang.ClassCastException bekommen: $ Proxy0 kann nicht auf org.springframework.batch.item.database.JdbcCursorItemReader

Antwort

11

gegossen werden können um das erste Problem umgehen unter Verwendung von ApplicationContextAware anstelle von BeanFactoryAware. Dies wird in der ApplicationContext übergeben, die die getBeansOfType() -Methode hat, mit der Sie alle Beans eines bestimmten Typs abrufen können.

Das zweite Problem wird wahrscheinlich verursacht, weil etwas AOP Proxies rund um Ihre JdbcCursorItemReader Bohne erstellt. Diese generierten Proxys implementieren standardmäßig die gleichen Schnittstellen, die JdbcCursorItemReader haben (speziell ItemReader und ItemStream). Ihr Code sollte nicht versuchen, in den Klassentyp (JdbcCursorItemReader) zu konvertieren, sondern stattdessen auf einen dieser Schnittstellentypen. Es ist normalerweise möglich, den Proxy zu zwingen, die proxied-Klasse direkt zu erweitern, aber ohne etwas über Ihr Setup zu wissen, kann ich Ihnen dabei nicht helfen.

+0

Kann ich es in ItemReader umwandeln und einfach verwenden? Und die Proxy-Magie wird mir den wahren Leser geben? Hummmm Frühling ist manchmal kompliziert – bwawok

+1

@bwawok: Ja, casting zu 'ItemReader' sollte gut funktionieren. Versuchen Sie einfach nicht, nach 'JdbcCursorItemReader' zu konvertieren. – skaffman

+0

@skaffman: aber was ist, wenn ich so etwas machen muss ((JdbcCursorItemReader) itemReader) .open (executionContext); –

Verwandte Themen