2010-10-21 7 views
7

J'essaye d'installer un projet Spring 3 Web MVC, en utilisant l'approche @Controller, basée sur des annotations.Comment puis-je combiner @Aspect avec @Controller dans Spring 3?

package my.package 

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

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

Mon répartiteur-servlet a les gestionnaires de contrôleur suivants:

<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" /> 

Le webapp fonctionne bien avec les artefacts Maven fournis:

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

Maintenant, je voulais ajouter @AspectJ AOP . Je suis les libs:

<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> 

ajouté à mon applicationContext.xml:

<aop:aspectj-autoproxy/> 

fait en sorte de créer le haricot pertinent dans le applicationContext.xml ainsi:

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

et a commencé étaler le @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 

Maintenant, c'est là où il a cessé de fonctionner. "fooo" n'est jamais imprimé. Cela peut-il être dû au fait que les objets pointés (orthographiés?) Doivent être gérés par des ressorts et que mon @Controller associé au DefaultAnnotationHandlerMapping n'est pas perçu comme tel.?

Toute aide serait appréciée. Si j'ai oublié d'inclure des informations, s'il vous plaît demander. J'espère que quelqu'un peut m'aider ici.

Merci beaucoup!

Répondre

3

La méthode pointcut définit le pointcut, il n'est pas appelé sur une correspondance, vous devez définir quelque chose pour arriver réellement. par exemple,

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

Argh dieu .. enfin obtenu le travail!

Merci pour votre réponse Affe!

Pour les curieux:

  1. Ne pas utiliser pour obtenir le composant-scan et defaultannotationhandlers vos contrôleurs
  2. Fil les au printemps xml
  3. Ne pas avoir ces contrôleurs dans dispatcher-servlet tout en aop config se trouve dans applicationContext.
  4. Déplacer à la fois au répartiteur Servlet

  5. Bien sûr Affe est juste: ne pas oublier les conseils: p

+2

point 3 est le bit manquant pour moi, merci :) – Custard

7

Pour la deuxième chzbrgla, pour ceux qui voient plus tard (comme moi), mon problème résolu après avoir déplacé le balayage des composants du contrôleur et aop config au servlet répartiteur comme ceci:

... 
<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> 
... 

comme vous pouvez le voir, l'analyse des composants toujours travaillé dans mon cas. Déplacer les deux à la servlet Dispatcher résolu pour moi.

Le apspect (myApect1, dans ce cas) a été configuré comme suit:

@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

quand j'ai essayé d'utiliser l'aspect mentionné ci-dessus, i » m obtenir l'erreur ci-dessous causée par: java.lang.IllegalArgumentException: erreur à :: 0 ne peut pas trouver référencé contrôleur pointcut \t à org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression (PointcutParser.java:302) \t à org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression (AspectJExpress ionPointcut.java:207) \t à org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression .............................. ................................................. S'il vous plaît suggérer –

Questions connexes