2010-10-21 12 views
7

Estoy intentando configurar un proyecto Spring 3 Web MVC, utilizando el @Controller, enfoque basado en anotaciones.¿Cómo puedo combinar @Aspect con @Controller en Spring 3?

package my.package 

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

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

Mi despachador-servlet tiene las siguientes controladores: Controlador

<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 aplicación web está funcionando bien con los artefactos Maven suministrados:

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

Ahora quería añadir @AspectJ AOP . Tengo las librerías:

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

añadido a mis applicationContext.xml:

<aop:aspectj-autoproxy/> 

aseguramos de crear el bean principal en el applicationContext.xml así:

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

Y empecé desarrollando el @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 

Ahora aquí es donde dejó de funcionar. "fooo" nunca se imprime.

Podría ser, porque los objetos puntiagudos (¿ortografía?) Deben ser beans gestionados por resorte y mi @Controller en combinación con DefaultAnnotationHandlerMapping no se percibe como tal.

Cualquier ayuda sería apreciada. Si olvidé incluir información, por favor pregunte. Espero que alguien pueda ayudarme aquí.

¡Muchas gracias!

Respuesta

3

El método de punto de corte define el punto de corte, no se llama en una coincidencia, necesita definir algo para que realmente suceda. por ejemplo,

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

Argh god ... ¡finalmente funcionó!

Gracias por su respuesta Affe!

Para los curiosos:

  1. No utilice el componente de exploración y defaultannotationhandlers para obtener los controladores
  2. alambre en XML de Spring
  3. no tienen dichos controladores en despachador-servlet mientras AOP config se encuentra en applicationContext.
  4. Mover tanto al despachador-servlet

  5. Por supuesto Affe tiene razón: no se olvide el consejo: p

+2

El punto 3 fue la falta poco para mí, gracias :) – Custard

7

Para chzbrgla segundo, para aquellos que ven esto más adelante (como yo), mi problema resuelto después de mover el componente de exploración del controlador y AOP config para el servlet despachador de este 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> 
... 

como se puede ver, la exploración componente aún funcionaba en mi caso. Mover tanto al servlet del despachador me lo resolvió.

El apspect (myApect1, en este caso) se configuró como sigue:

@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

cuando traté de utilizar el aspecto mencionado anteriormente, i' m conseguir el error abajo causada por: java.lang.IllegalArgumentException: error al :: 0 no puede encontrar el controlador hace referencia pointcut \t en org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression (PointcutParser.java:302) \t en org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression (AspectJExpress ionPointcut.java:207) \t en org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression .............................. ................................................. Por favor sugerir –

Cuestiones relacionadas