2014-05-12 6 views
6

Ich möchte Code vor jeder Methode in einem Spring (3.2.3) @Controller ausführen. Ich habe Folgendes definiert, aber es wird nicht ausgeführt. Ich vermute, dass der Pointcut Ausdruck falsch ist.Spring AOP Pointcut für alle Methoden in einem Controller

Dispatcher-servlet.xml

<aop:aspectj-autoproxy/> 
<bean class="com.example.web.controllers.ThingAspect"/> 

c.e.w.c.ThingAspect

@Pointcut("execution(com.example.web.controllers.ThingController.*(..))") 
public void thing() { 
} 

@Before("thing()") 
public void doStuffBeforeThing(JoinPoint joinPoint) { 
    // do stuff here 
} 
+1

Vielleicht ein [ '@ ControllerAdvice'] (http://docs.spring.io/spring/docs/4.0.3.RELEASE/javadoc-api/org/springframework/web/bind/annotation/ControllerAdvice .html) ist was du suchst. –

+0

Wird (a) überhaupt nicht oder (b) für einige Methoden nicht ausgeführt? Dies würde helfen, Ihr Problem zu diagnostizieren. – Phil

+0

Ich wusste nicht, dass ControllerAdvice existiert, aber wenn ich die Dokumentation betrachte, wird ExceptionHandler, InitBinder und ModelAttribute an mehrere Controller angehängt. Ich suchte nach etwas, das vor jeder Methode ausgeführt werden sollte, in meinem Fall sind alle annotierten Methoden von RequestMapping. Im Moment wird der Aspekt überhaupt nicht nach irgendwelchen Methoden aufgerufen. Ich könnte einen Spring Interceptor verwenden, aber AOP schien für diese Aufgabe ideal geeignet. – Goose

Antwort

4

Ihr Pointcut-Ausdruck fehlt ein Rückgabetyp wie void, String oder *, z.

execution(* com.example.web.controllers.ThingController.*(..)) 
7

Der richtige Weg, um es in den aktuellen Versionen von Spring MVC zu tun ist durch eine ControllerAdvice.
Siehe: Advising controllers with the @ControllerAdvice annotation

Bei früheren Versionen, auf diese Antwort von mir beziehen: https://stackoverflow.com/a/5866960/342852

+0

Dies sollte als die akzeptierte Antwort markiert sein ... – kaqqao

+0

@kaqqao Ich stimme nicht zu, '@ ControllerAdvice' hat nur eine bestimmte Reihe von Möglichkeiten. Sie könnten möglicherweise jede '@ RequestMapping'-Methode mit '@ ModelAttribute' abfangen, aber Sie hätten nur den Kontext des' Model' und sonst nichts. Ich denke, Sie sollten @geoand upvote, obwohl ich nicht auf Spring MVC Abfangjäger geschaut habe, glaube ich, 'ControllerAdvice' ist nicht stark genug. – froginvasion

+0

@geoand Antwort ist in der Tat gut und ich habe es gerade jetzt upvoted. Dennoch hat die Frage nicht wirklich viel über die Besonderheiten gesagt, nur dass etwas vor jeder Methode laufen sollte und '@ ControllerAdvice' das tut ... – kaqqao

2

Neben @ControllerAdvice, die bereits in einer anderen Antwort erwähnt wird, Sie Spring MVC interceptors heraus überprüfen sollten.

Sie vereinfachen grundsätzlich AOP für Controller und können in Fällen verwendet werden, in denen @ControllerAdvice Ihnen nicht genügend Leistung gibt.

Verwandte Themen