2017-12-28 9 views
1

Ich habe eine Klasse SaveRoute, die eine Autowired-Eigenschaft SaveProcessor hat. Diese SaveProcessor-Klasse hat eine Methode, die mit @Transactional Annotation versehen ist. Wenn ich versuche, meine Anwendung auszuführen, gibt Java die Ausnahme aus, dass die SaveProcessor-Abhängigkeitsinjektion fehlgeschlagen ist. Wenn ich @Transactional-Annotation aus der SaveProcess-Klassenmethode entferne, funktioniert es einwandfrei.Spring @Transactional Annotation meine Klasse nicht in der Lage zu Autowire

public class SaveRoute implements RouteBuilder{ @Autowired private SaveProcessor saveProcessor; }

public class SaveProcessor implements Processor{ 

@Override 
public void Process(Exchange exchange){ 
    this.save(); 
} 
@Transactional 
public void Save(){ 

}} 

It would be great if someone could help me on this. @Transactional making SaveProcessor class not a candidate for autowiring. 
+1

Mögliche Duplikat hat (https [Wie der Transaktionsklasse autowire?]: // Stackoverflow.com/questions/33240700/How-to-Autowire-on-Transaktion-Klasse) – tsolakp

+0

Sie müssen viel mehr Kontext bereitstellen. Wie aktivierst du Spring AOP? Benutzt du Boot? Wie sehen deine Build-Abhängigkeiten aus? – chrylis

+0

@ tsolakps Duplikat erklärt das Problem klar, aber es ist veraltet, also werde ich das noch nicht dupe- hammern. – chrylis

Antwort

-1

Sie sollten Processor Schnittstelle statt SaveProcessor konkrete Klasse verwenden, wenn diese Art autowiring:

@Autowired 
private Processor saveProcessor; 
+0

Das ist nicht die einzige Lösung. Die Alternative kann die Verwendung von CGLIB sein. – tsolakp

+0

Ich kann die Prozessorschnittstelle nicht verwenden, da die Prozessorschnittstelle in meinen Anwendungen verschiedene Implementierungen hat. –

+0

Als die '' Qualifier' Annotation des Frühlinges sollte helfen – andrii

0

ich in der Lage war, eine Lösung herauszufinden. Hinzufügen

@Scope (Proxymode = ScopedProxyMode.TARGET_CLASS)

auf meinem SaveProcessor Klasse gelöst mein Problem.

Ich kann nicht

@Autowire öffentlichen Prozessor SaveProcessor verwenden;

Dies liegt daran, dass in meiner Anwendung Mulpile-Implementierung für Processor sind.

+0

Wenn Sie mehrfache Implementierung dann verwenden, können Sie '@ Qualifire benutzen. Es ist besser, wenn Sie die Schnittstelle zum Autowiring verwenden (benutzter interface-basierter Proxy), aber wenn Sie klassenbasiertes Autowiring verwenden, sollte Ihre Klasse ebenfalls eine Spring-Komponente sein. Das bedeutet, dass Ihre Klasse entweder mit '@ Component' oder' @ Service' oder '@ Repository' versehen sein sollte. –

0

mit Spring @Transactional annotation making my class not able to Autowire Antwort einverstanden, es ist eine gute Praxis durch die Schnittstelle autowire, wenn Sie

@Transactional

Feder make Proxy Ihres SaveProcessor Objekt gesetzt, weil es implementiert Prozessor Frühling wird DynamicProxy verwenden. , so dass Sie mit Klasse SaveProcessor in Zusammenhang keine Bohne haben, haben Sie eine Bohne mit calss Proxy $ .. Wich intarface Prozessor implementieren.

Deshalb kann der Frühling keinen Kandidaten finden.

es ist kein Problem, wenn Sie mehr als eine Implementierungen von Prozessor haben, verwenden nur

@Qualifier

oder autowiring von BeanName. in Ihrem Fall

@Autowired 
private Processor saveProcessor; 

wird Arbeit, beacause Bohne Name saveProcessor

Verwandte Themen