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!
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 vonThrowable
, 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.
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.
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.
Tags und Links java spring dependency-injection java-5 java-6