Spring Autowire Annotation für die abstrakte Klasse: Es ist keine eindeutige Bean definiert

8

Ich habe eine abstrakte Klasse:

%Vor%

Und eine Reihe von Klassen, die es erweitern und die export () -Methode überschreiben (oder nicht).

%Vor%

Die meisten meiner Tests führen autarke konkrete Klassen durch, die BaseReport ohne Probleme erweitern:

%Vor%

Dies funktioniert gut für das Autowiren aller Klassen, die erweitern BaseReport. Aber ich muss auch die abstrakte Klasse selbst, BaseReport, autowire, um die export () -Methode zu testen.

%Vor%

Wenn ich es versuche, bekomme ich den berüchtigten:

Es ist kein eindeutiges Bean vom Typ BaseReport definiert: erwartetes einzelnes passendes Bean, aber 2 [Report1, Report2].

Ich habe versucht, @Qualifier zu verwenden, aber das Problem mit @Qualifier ist, dass (wie ich es verstehe) Sie es verwenden, um Spring zu sagen, welche Klasse - die eine Schnittstelle implementiert oder eine abstrakte Klasse erweitert - Sie verwenden möchten. Aber das ist nicht mein Fall. Ich möchte die abstrakte Klasse selbst verwenden.

Ich habe auch versucht, @Resource wie folgt zu verwenden:

%Vor%

Spring sagt mir, dass es keine Bohne mit diesem Namen gibt. : (

Wie kann ich das tun?

Prost.

    
Robert Bowen 12.04.2013, 12:22
quelle

1 Antwort

13

Abstrakte Klassen können nicht instanziiert werden, Sie müssen eine konkrete Implementierung verwenden. Wenn Sie versuchen, eine abstrakte Klasse zu instanziieren, werden Sie wie in regulärem Java angewiesen, die darin enthaltenen abstrakten Methoden zu implementieren. Wenn Sie dies tun, wird eine anonyme Klasse erstellt. Es ist keine Installation der abstrakten Klasse, sondern eine neue Unterklasse dieser abstrakten Klasse.

Spring sucht nach Klassen, die Ihre Basisklasse erweitern, nämlich Report1 und Report2. Spring sieht mehrere Klassen, die den Anforderungen entsprechen und nicht wissen, welche ausgewählt werden sollen. Daher erhalten Sie den Fehler, dass mehrere übereinstimmende Beans vorhanden sind.

Sie können das beheben, indem Sie mit einem "Adapter" eine konkrete Klasse erstellen, die Ihre Basisklasse erweitert, die abstrakten Methoden implementiert, aber nichts tut. Dann können Sie diese Implementierung automatisch starten und testen. Allerdings sollte Ihre abstrakte Klasse bereits getestet werden, da Sie Bericht 1 und 2 testen. Wenn bei Ihrer Basisklasse immer noch Fehler auftreten, bedeutet dies, dass Logik, die Sie nicht verwenden, Fehler verursacht, was ohnehin eine schlechte Übung ist. Auch mit einem Testabdeckungswerkzeug konnten Sie auf diese Weise ungenutzten Code erkennen.

    
G-Man 12.04.2013, 12:27
quelle