Ich bin ein Stück weiter - habe einige Antworten und noch eine offene Frage:
Wichtig:
Wenn man in einen Controller mit Spring AOP einen Aspekt integrieren möchte, so müssen die Konfiguration der Controller-Beans und der Aspekte in einer xml-Datei stehen!
Wir haben uns in unserem Projekt dafür entshieden, die Konfiguration etwas zu entzerren und ich wollte ide gesamte AOP-Konfiguration mit in die service.xml stecken. Die Controller-Beans waren in der servlet.xml definiert. Aber so passierte an den Controllern überhaupt gar nichts. Nachdem ich den aop-Konfig-Block mit in die servlet.xml gesteckt habe, hatte ich überhaupt erstmal output.
Mein erstes Ziel bestand nun darin in die Methoden, welche ModelAnd View als return haben, einen Aspekt zu integrieren, um diesen zu 'bearbeiten'.
Anschliessend wollte ich auf beliebige Methoden damit zugreifen (Beispiel hier setUserManager()).
Dazu habe ich jetzt folgende AOP-Konfiguration:
Was man jetzt beobachtet, ist folgendes:
1. Klassen mit Interfaces (implements Controller) integrieren Apekt1 über ihre eigene handleRequestmethode.
2. Klassen ohne eigene Interfaces (z.B. mit extends SimpleFormController) integrieren nur Aspekt2 über die handleRequestMethode des AbstractControllers.
3. bei keiner Klasse ist AOP in der Lage andere eigene Methoden (z.B. setUsermanager() ) anzugreifen.
Augenscheinlich wird die CGLib nicht benutzt. Meine offene Frage ist jetzt noch, warum!? Habe ich nicht mit 'proxy-target-class="true"' Spring dazu aufgefordert die CGLib immer zu benutzen?
Was mir auffällt ist, dass ich im Log massenhaft Einträge wie den folgenden habe:
"...
21:44:46,633 WARN Cglib2AopProxy:256 - Unable to proxy method [public final org.springframework.context.ApplicationContext org.springframework.context.support.ApplicationObjectSupport.getApplicationContext() throws java.lang.IllegalStateException] because it is final: All calls to this method via a proxy will be routed directly to the proxy.
..."
Hier scheint er zu versuchen, die CgLib zu benutzen und scheitert - vertändlicherweise - an der final-Methode. OK- dass das nicht geht ist mir klar, aber warum versucht er es nicht bei meinen Controllern? Da ist nichts final!
Und wirklich: wenn ich proxy-target-class="false" setze, ändert sich nichts - nur die Fehlermeldungen im log verschwinden ...
Also noch einmal die Frage. warum zieht proxy-target-class="true" nicht bei den Controllern!
beste Grüße - pasternak
Wichtig:
Wenn man in einen Controller mit Spring AOP einen Aspekt integrieren möchte, so müssen die Konfiguration der Controller-Beans und der Aspekte in einer xml-Datei stehen!
Wir haben uns in unserem Projekt dafür entshieden, die Konfiguration etwas zu entzerren und ich wollte ide gesamte AOP-Konfiguration mit in die service.xml stecken. Die Controller-Beans waren in der servlet.xml definiert. Aber so passierte an den Controllern überhaupt gar nichts. Nachdem ich den aop-Konfig-Block mit in die servlet.xml gesteckt habe, hatte ich überhaupt erstmal output.
Mein erstes Ziel bestand nun darin in die Methoden, welche ModelAnd View als return haben, einen Aspekt zu integrieren, um diesen zu 'bearbeiten'.
Anschliessend wollte ich auf beliebige Methoden damit zugreifen (Beispiel hier setUserManager()).
Dazu habe ich jetzt folgende AOP-Konfiguration:
Code:
<bean id="AspectBean" class="mypackage.AspectClass" />
<aop:aspectj-autoproxy/>
<aop:config proxy-target-class="true">
<aop:aspect id="myAspect1" ref="AspectBean">
<aop:pointcut id="saveViewInModelPoinCut"
expression="execution(org.springframework.web.servlet.ModelAndView
myProject.web.controller.*.*(..))"/>
<aop:after-returning pointcut-ref="saveViewInModelPoinCut"
method="test1" returning="ModelAndView" />
</aop:aspect>
<aop:aspect id="myAspect2" ref="AspectBean">
<aop:pointcut id="test"
expression="execution(* org.springframework.web.servlet.mvc.AbstractController.handleRequest(..))" />
<aop:after-returning pointcut-ref="test"
method="test2" returning="ModelAndView" />
</aop:aspect>
<aop:aspect id="myAspect3" ref="AspectBean">
<aop:pointcut id="test2"
expression="execution(*
myProject.web.controller.*.setUserManager(..))"/>
<aop:before pointcut-ref="test" method="test3"/>
</aop:aspect>
</aop:config>
Was man jetzt beobachtet, ist folgendes:
1. Klassen mit Interfaces (implements Controller) integrieren Apekt1 über ihre eigene handleRequestmethode.
2. Klassen ohne eigene Interfaces (z.B. mit extends SimpleFormController) integrieren nur Aspekt2 über die handleRequestMethode des AbstractControllers.
3. bei keiner Klasse ist AOP in der Lage andere eigene Methoden (z.B. setUsermanager() ) anzugreifen.
Augenscheinlich wird die CGLib nicht benutzt. Meine offene Frage ist jetzt noch, warum!? Habe ich nicht mit 'proxy-target-class="true"' Spring dazu aufgefordert die CGLib immer zu benutzen?
Was mir auffällt ist, dass ich im Log massenhaft Einträge wie den folgenden habe:
"...
21:44:46,633 WARN Cglib2AopProxy:256 - Unable to proxy method [public final org.springframework.context.ApplicationContext org.springframework.context.support.ApplicationObjectSupport.getApplicationContext() throws java.lang.IllegalStateException] because it is final: All calls to this method via a proxy will be routed directly to the proxy.
..."
Hier scheint er zu versuchen, die CgLib zu benutzen und scheitert - vertändlicherweise - an der final-Methode. OK- dass das nicht geht ist mir klar, aber warum versucht er es nicht bei meinen Controllern? Da ist nichts final!
Und wirklich: wenn ich proxy-target-class="false" setze, ändert sich nichts - nur die Fehlermeldungen im log verschwinden ...
Also noch einmal die Frage. warum zieht proxy-target-class="true" nicht bei den Controllern!
beste Grüße - pasternak