Kann ich BeanCreationException ignorieren und stattdessen null injizieren?

8

Wir haben eine Situation, in der unser Spring einige Beans verdrahtet, die ActiveMQ-Klassen enthalten, die mit Java 6 erstellt wurden. Unsere Anwendung läuft auf den Servern des Kunden, weshalb wir nicht garantieren können, dass sie Java 6 oder später installiert haben. Wenn sie Java 5 haben, kann die Anwendung wegen BeanCreationException s nicht mit den Klassen starten, die von ActiveMQ abhängen (die Ursache ist UnsupportedClassVersionError ).

Also meine Frage ist, gibt es eine Möglichkeit, ein BeanCreationException zu ignorieren und immer noch die Anwendung zu starten? Ich möchte in der Lage sein, eine Fehlermeldung anzuzeigen, dass sie Java 6 oder später installieren müssen, aber da die Anwendung nicht einmal gestartet werden kann, habe ich nie die Möglichkeit, dies zu tun.

Meine Vermutung ist, dass es dazu keine Möglichkeit gibt, denn Spring muss garantieren können, dass meine Anwendung nach der Initialisierung korrekt erstellt wird, aber ich dachte, ich würde trotzdem fragen. Irgendwelche anderen Vorschläge, wie man mein Endziel erreicht, wäre auch hilfreich und geschätzt.

Wir verwenden Spring 3.0.6

Danke!

    
Sean Adkinson 17.01.2012, 22:52
quelle

3 Antworten

0

Zunächst einmal werden alle throwables, die eine Unterklasse von java.lang.Error sind, allgemein als nicht wiederherstellbar betrachtet. Obwohl es möglich ist, sie zu fangen, wird davon abgeraten :

  

Ein Error ist eine Unterklasse von Throwable , die auf schwerwiegende Probleme hinweist, die eine sinnvolle Anwendung nicht zu erfassen versuchen sollte. Die meisten dieser Fehler sind abnorme Bedingungen.

Wenn Sie jedoch nur eine Fehlermeldung anzeigen, sollten Sie damit durchkommen.

SO, um auf Ihre Frage zurückzukommen, schlage ich vor, Erstellen einer Implementierung von Spring's FactoryBean interface, die versuchen würde, die ActiveMQ-Klassen zu laden. Wenn es funktioniert, kann es das entsprechende Objekt von FactoryBean.getObject zurückgeben. Wenn dies fehlschlägt (über eine abgefangene UnsupportedClassVersionError ), kann entweder ein null oder ein anderes Objekt zurückgegeben werden, das diese Bedingung darstellt.

    
skaffman 17.01.2012, 23:06
quelle
4

Wenn Sie ein Upgrade auf Spring 3.1 (stable) durchführen können, nutzen Sie die Java-Konfiguration:

%Vor%

oder:

%Vor%

In älteren Versionen von Spring% könnte co_de% verwendet werden, um dieselbe Logik zu implementieren. Anstatt FactoryBean zurückzugeben, können Sie auch eine falsche Implementierung zurückgeben, die Sie später entdecken können, und den Benutzer warnen, wenn die Anwendung versucht, sie zu verwenden.

    
Tomasz Nurkiewicz 17.01.2012 23:06
quelle
0

Sie können eine Factory-Bean erstellen und die tatsächliche ActiveMQ-Bean erstellen lassen. Wenn es nicht initialisiert werden kann, könnte die Fabrik eine Dummy- / Scheinimplementierung zurückgeben, so dass die Dinge nicht kaputt gehen. Später könnten Sie die Fabrik fragen, ob alles in Ordnung sei.

Ссылка

    
Markus Kramer 17.01.2012 23:06
quelle