如何在Spring 3中将@Aspect和@Controller结合起来?
我试图建立一个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的组合不会被认为是这样吗?
任何帮助,将不胜感激。如果我忘记包含任何信息,请询问。 希望有人能帮助我。
非常感谢!
切入点方法定义了切入点,它不会在匹配上调用,您需要定义一些实际发生的事情。例如,
@Before("foo()")
public void beforeFoo(JoinPoint joinPoint) {
System.out.println("foooo");
}
哎哟神..终于得到它的工作!
感谢您的回复感动!
对于好奇:
- 不要使用组件扫描和defaultannotationhandlers让你的控制器
- 线材他们在春季XML在调度员的servlet而AOP
- 没有说控制器config位于applicationContext中。
移动同时向调度员的servlet
当然是Affe是正确的:不要忘了建议:对
第二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.
}
当我试图使用上述方面,我米得到以下错误 所致: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
点3位失踪了我,谢谢:) – Custard 2013-06-21 15:33:46