2010-10-21 32 views
7

我试图建立一个Spring 3 Web MVC项目,使用@Controller,基于注解的方法。如何在Spring 3中将@Aspect和@Controller结合起来?

package my.package 

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

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

我的调度员servlet有以下控制器处理程序:

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

web应用程序运行良好,所提供的Maven构件:

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

现在,我想补充@AspectJ AOP 。我得到了林达:

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

添加到我的applicationContext.xml:

<aop:aspectj-autoproxy/> 

确信建立在applicationContext.xml相关豆以及:

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

而且开始充实@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 

现在这是停止工作的地方。 “fooo”从不打印。

难道是因为pointcutted(拼写?)对象必须是spring管理的bean,并且我的@Controller与DefaultAnnotationHandlerMapping的组合不会被认为是这样吗?

任何帮助,将不胜感激。如果我忘记包含任何信息,请询问。 希望有人能帮助我。

非常感谢!

回答

3

切入点方法定义了切入点,它不会在匹配上调用,您需要定义一些实际发生的事情。例如,

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

哎哟神..终于得到它的工作!

感谢您的回复感动!

对于好奇:

  1. 不要使用组件扫描和defaultannotationhandlers让你的控制器
  2. 线材他们在春季XML在调度员的servlet而AOP
  3. 没有说控制器config位于applicationContext中。
  4. 移动同时向调度员的servlet

  5. 当然是Affe是正确的:不要忘了建议:对

+2

点3位失踪了我,谢谢:) – Custard 2013-06-21 15:33:46

7

第二chzbrgla,对于那些谁查看此之后(像我),我的问题控制器组件扫描和AOP配置移动到调度的servlet像这样以后解决:

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

正如你所看到的,组件扫描仍然在我的情况下工作。移动到调度程序servlet为我解决了它。

的apspect(myApect1,在这种情况下)配置如下:

@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

当我试图使用上述方面,我米得到以下错误 所致:java.lang.IllegalArgumentException异常:错误在:: 0找不到参考切入点控制器 \t在org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:302) \t at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpress ionPointcut.java:207) \t at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression .............................. ................................................. 请建议 – 2015-08-10 05:15:58

相关问题