Implementieren Sie die Transaktionsverarbeitung für die Methode. Als ich versuchte, es mithilfe der Annotation @Transactional zu implementieren, trat beim Hinzufügen der Annotation eine BeanCreationException auf.
Erstellen Sie eine Schnittstelle für die Klasse, die die Zielmethode für die Transaktionsverarbeitung enthält, und fügen Sie der Methode der Implementierungsklasse die Annotation @Transactional hinzu. Jetzt gibt es keine Fehler mehr und Sie können erfolgreich kompilieren.
HogeProcessor.java
public interface HogeProcessor extends Processor<Object, Object> {
Optional<Object> process(HogeEntity hogeEntity);
}
HogeProcessorImpl.java
public class HogeProcessorImpl implements HogeProcessor {
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public Optional<Object> process(HogeEntity hogeEntity) {
...
...
}
}
Ich habe selbst recherchiert, aber ich habe es nicht verstanden, also habe ich ihn gebeten, es mir zu sagen.
Wenn die Schnittstelle und die Implementierungsklasse getrennt und behoben sind, ist dies die Ursache. http://stackoverflow.com/questions/15688689/unsatisfieddependencyexception-in-spring-illegal-arguments-for-constructor-a
Aufgrund der Spezifikationen der für AOP verwendeten Bibliothek finden Sie Details hier. http://d.hatena.ne.jp/minokuba/20110321/1300705068
Ich habe es selbst nach dem Lesen der Seite, die mir beigebracht wurde, nicht verstanden, also habe ich es nachgeschlagen. Unten finden Sie eine Zusammenfassung der recherchierten Inhalte.
Die @ Transactional-Annotation von Java wird mit Spring AOP realisiert, aber diese AOP-Bibliothek scheint die Ursache für diese Zeit zu sein.
Aspektorientierte Programmierung. Aspekt ist ein Verhalten und eine Einheit der gemeinsamen Verarbeitung. Ein Mechanismus, mit dem Sie eine gemeinsame systematische Verarbeitung durchführen können, die für das Geschäft nicht unbedingt erforderlich ist.
Dieses Mal wird AOP verwendet, um den Prozess zum Starten der Transaktion zum Zeitpunkt des Aufrufs der angegebenen Methode einzufügen.
Es scheint, dass AOP aktiviert werden kann, indem Folgendes in die Einstellungsdatei geschrieben wird.
aop.xml
<!--AOP aktivieren-->
<aop:aspectj-autoproxy/>
Im Frühjahr AOP -JDK Dynamic Proxy ・ CGLib Es können zwei Typen verwendet werden. In dem Projekt, bei dem diesmal das Problem auftrat, wurde nur der dynamische JDK-Proxy verwendet.
Die Klasse, auf die der AOP-Aspekt abzielt, muss eine JavaBean sein.
- Spring erstellt zur Laufzeit ein Proxy-Objekt für die Aspekt-Zielklasse.
http://hamasyou.com/blog/2004/11/09/spring-framework-jue-shu-ki-aop/
Mit anderen Worten, wenn die AOP-Bibliothek eine Bean einer Aspektzielklasse erstellt, erstellt sie ein ProxyObject, das in einen Proxy eingeschlossen ist (Proxy-Konvertierung).
Es scheint nicht möglich zu sein, eine Instanz einer Bean, die vom dynamischen JDK-Proxy zum Proxy gemacht wurde, durch direkte Angabe der Implementierungsklasse automatisch zu verdrahten.
http://kamatama41.hatenablog.com/entry/20140327/1395928048
Bei Verwendung von JDK DynamicProxy ist die Klasse, die die Schnittstelle implementiert, das Ziel der Proxy-Konvertierung. Mit anderen Worten, es scheint, dass die Implementierungsklasse nicht direkt DI sein kann. Dieses Mal habe ich versucht, AOP von @ Transactional zu verwenden, während die Implementierungsklasse direkt DI war. Daher war dies nicht das Ziel der Proxyisierung von JDK DynamicProxy, und die Ursache war, dass BeanCreationException aufgetreten ist.
Also habe ich eine neue Schnittstelle für die vorhandene Klasse erstellt und diese in DI für diese Schnittstelle geändert und sie gelöst, indem ich die vorhandene Klasse zu einer Implementierungsklasse der Schnittstelle gemacht habe. Es scheint auch, dass die Implementierungsklasse mithilfe von CGLib, einer anderen AOP-Bibliothek, in einen Proxy umgewandelt werden kann. Daher habe ich es diesmal nicht versucht, aber es scheint eine Möglichkeit zu geben, dies zu verwenden.
Recommended Posts