2010-10-21 29 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

相關問題