2010-02-10 9 views
7

Dies ist der Teil der Beispiel-Feder-Kontextdatei. Ich versuche, einen Transaktionshinweis für SampClass zu erstellen, um auf der Speichermethode auszuführen.Spring Transaction - Proxy Verwirrung

Also von meinem Verständnis sollte es einen Proxy für SampClass nur erstellen.

Ich habe einen SearchDispatchRpcGwtServlet, die als Argument, die ein Webservice Kunde nimmt auch an sich schon ein Proxy ist. Diese Bean wird auch aus irgendeinem Grund proxied, wo es fehlschlägt, weil es keinen Proxy eines Proxys erstellen kann.

Ich muss hinzufügen, dass SearchDispatchRpcGwtServlet eine Instanz von SampClass erstellt und die Speichermethode aufruft.

Ich erhalte die folgende Ausnahme:

java.lang.IllegalArgumentException: Kann nicht final class Klasse Unterklasse $ Proxy118 bei net.sf.cglib.proxy.Enhancer.generateClass (Enhancer .java-: 446) um net.sf.cglib.transform.TransformingClassGenerator. generateClass (TransformingClassGenerator.java:33)

Ich verstehe nicht, warum SearchDispatchRpcGwtServlet Proxy erstellt bekommen. Kann jemand das erklären?

Addition Stack Trace

Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class $Proxy117]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class class $Proxy117 
    at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:213) 
    at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:110) 
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:473) 
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:348) 
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:309) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:361) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.postProcessObjectFromFactoryBean(AbstractAutowireCapableBeanFactory.java:1427) 
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport$1.run(FactoryBeanRegistrySupport.java:139) 
    ... 85 more 
Caused by: java.lang.IllegalArgumentException: Cannot subclass final class class $Proxy117 
    at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:446) 
    at net.sf.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33) 
    at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) 
    at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216) 
    at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377) 
    at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285) 
    at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:201) 
+0

Können wir mehr vom Stack-Trace sehen? Was du uns gegeben hast, ist nicht wirklich genug. – skaffman

+0

Ich werde das Problem genauer erklären. Ich habe eine aop pointcut definiert für Bean A. habe ich Bean B definiert nach Bean A in der Kontext-Datei. Von was ich mir nur vorstellen Bean Ein Proxy sollte erstellt werden. In diesem Fall wird aber auch der Bean-B-Proxy erstellt, der als Argument einen Webserver-Client-Proxy enthält. Ist das ein gültiges Verhalten? Kann ich etwas tun, um dies zu vermeiden? Meaning aop, das nur die spezifizierte Bean proxy darf. – nagl

+0

Ich habe den Stack-Trace hinzugefügt – nagl

Antwort

1

eine Unterklasse von AbstractAutoProxyCreator versucht, eine Bohne zu Proxy, aber das Bean ist bereits selbst ein CGLIB Proxy einen anderen Mechanismus erstellt wie aop:config proxy-target-class="true.

Um dies zu vermeiden, stellen Sie sicher, dass die verschiedenen Aspekt Weben Mechanismen Vermischung zu vermeiden (ProxyBeanFactory und AOP: config) für die gleiche Bean.

In diesem Fall können die Transaktionsaspekte auch über <tx:annotation:driven/> über die @Transactional Annotation gewebt werden.

Alternativ wäre es möglich, den autowiring/Scannen von der Bohne zu entfernen und die Injektion von Abhängigkeiten über XML-Setter zu tun.

Eine weitere Alternative ist die Ladezeit Weben von <context:load-time-weaver/> erklärt überall zu verwenden, und das Hinzufügen der benötigten Gläser.

Werfen Sie auch einen Blick auf diese post, es wäre allgemein besser, nur eine einzige Möglichkeit zur Anwendung der Aspekte in der gesamten Anwendung zu verwenden, um dieses Problem zu vermeiden.

+2

Autowiring erstellt keinen Proxy. –

+0

die 'AbstractAutowireCapableBeanFactory' die nach dem Javadoc bietet Verkabelung (einschließlich Autowire) versucht, einen CGLIB-Proxy über einen Bean-Prozessor zu erstellen, ist es in der Stacktrace –

+3

Nein ist es nicht ... eine Unterklasse von * AbstractAutoProxyCreator * versucht, die zu erstellen Proxy. Dieser Postprozessor wird wahrscheinlich von der AOP-Konfiguration registriert. Die Tatsache, dass es * AbstractAutowireCapableBeanFactory * auf der Stack-Trace gibt, ist für das Problem ziemlich irrelevant. Autowiring und Komponentenscan sind nicht verbundene Funktionen für das Proxying. –

Verwandte Themen