2010-10-21 9 views
7

Sto provando a configurare un progetto MVC Web di Spring 3, utilizzando l'approccio basato su annotazione @Controller.Come posso combinare @Aspect con @Controller in Spring 3?

package my.package 

@Controller 
@RequestMapping("/admin/*") 
public class AdminMultiActionController { 

@RequestMapping(value = "admin.htm", method = RequestMethod.GET) 
public String showAdminSection() { 
    return "admin"; 
} 

mio dispatcher-servlet ha le seguenti gestori di controllore:

<context:component-scan base-package="my.package" /> 
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> 

La webapp è in esecuzione bene con i manufatti Maven in dotazione:

<dependency> 
<groupId>org.springframework</groupId> 
<artifactId>spring-webmvc</artifactId> 
<version>3.0.2.RELEASE</version> 
</dependency> 

ora volevo aggiungere @AspectJ AOP . Ho avuto le librerie:

<dependency> 
<groupId>org.aspectj</groupId> 
<artifactId>aspectjweaver</artifactId> 
<version>1.6.9</version> 
</dependency> 
<dependency> 
<groupId>org.aspectj</groupId> 
<artifactId>aspectjrt</artifactId> 
<version>1.6.9</version> 
</dependency> 

aggiunto ai applicationContext.xml:

<aop:aspectj-autoproxy/> 

fatto in modo di creare il fagiolo rilevante nel applicationContext.xml così:

<bean id="securityInterceptor" class="my.package.service.SecurityInterceptor"/> 

e ha iniziato rimpolpare il @Aspect:

package my.package.service 

@Aspect 
public class SecurityInterceptor { 

@Pointcut("execution(* showAdminSection(..))")// the pointcut expression 
private void foo() { 
    System.out.println("fooo"); 
}// the pointcut signature 

Ora questo è dove ha smesso di funzionare. "fooo" non viene mai stampato.

Potrebbe essere, perché gli oggetti con punto (spelling?) Devono essere bean a gestione di primavera e il mio @Controller in combinazione con DefaultAnnotationHandlerMapping non è percepito come tale?

Qualsiasi aiuto sarebbe apprezzato. Se ho dimenticato di includere qualsiasi informazione, per favore chiedi. Spero che qualcuno possa aiutarmi qui.

Grazie mille!

risposta

3

Il metodo pointcut definisce il pointcut, non viene chiamato su una corrispondenza, è necessario definire qualcosa che possa effettivamente accadere. ad es.,

@Before("foo()") 
public void beforeFoo(JoinPoint joinPoint) { 
    System.out.println("foooo"); 
} 
8

Dio Argh .. finalmente ha funzionato!

Grazie per la tua risposta Affe!

Per i curiosi:

  1. Non utilizzare componente-scan e defaultannotationhandlers per ottenere il vostro controller
  2. Wire loro in xml primavera
  3. Non hanno detto i controllori a dispatcher-servlet mentre AOP config si trova in applicationContext.
  4. Spostare sia al dispatcher-servlet

  5. Naturalmente Affe ha ragione: non dimenticare il consiglio: p

+2

Il punto 3 è stato il po 'mancante per me, grazie :) – Custard

7

A seconda chzbrgla, per coloro che vedono questo più tardi (come me), il mio problema risolto dopo aver spostato il componente di scansione controller e AOP config al servlet dispatcher in questo modo:

... 
<context:component-scan base-package="com.mypackage.controller"/> 
<!-- Configure aspects. --> 
<bean id="myAspect1" class="com.mypackage.intercept.SiteAccessAspect"/> 

<aop:aspectj-autoproxy proxy-target-class="true"> 
    <aop:include name="myAspect1" /> 
</aop:aspectj-autoproxy> 
... 

come si può vedere, la scansione componente lavorava ancora nel mio caso. Spostare entrambi al servitore del dispatcher l'ha risolto per me.

L'apspect (myApect1, in questo caso) è stato configurato come segue:

@Pointcut("within(@org.springframework.stereotype.Controller *)") 
public void controller() {} 

@Pointcut("execution(* *(..))") 
public void method() {} 

@Before("controller() && method()") 
public void doAccessCheck(JoinPoint joinPoint) { 
System.out.println(joinPoint.getSignature()); // For testing purposes. 
} 
+0

quando ho provato ad utilizzare l'aspetto di cui sopra, i' m ottenendo l'errore sotto causati da: java.lang.IllegalArgumentException: errore in :: 0 non riesce a trovare riferimento regolatore pointcut \t a org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression (PointcutParser.java:302) \t in org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression (AspectJExpress ionPointcut.java:207) \t a org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression .............................. ................................................. Per favore suggerire –

Problemi correlati