2014-01-25 1 views
0

Я определяю Aspect и его конфигурации в прикладном context.xml, как это:Pointcut не срабатывают в Spring Controller

<aop:aspectj-autoproxy proxy-target-class="true"/> 
<bean id="myAspect" class="myAspectClass"/> 
<aop:config> 
    <aop:aspect ref="myAspect"> 
     <aop:pointcut id="myPointCut" expression="(@within(MyPointCutAnnotation) or @annotation(MyPointCutAnnotation)) and execution(* *(..))"/> 
     <aop:before pointcut-ref="myPointCut" method="beforeMethod" /> 
    </aop:aspect> 
</aop:config> 

И мой сервлет-context.xml выглядит примерно так:

<context:annotation-config /> 
    <context:component-scan base-package="mypackage" /> 
класс

My Spring Controller:

@Controller 
@RequestMapping(value="/xxx", method=RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE) 
public class MyController { 
    @MyPointCutAnnotation  
    @ResponseBody 
    @RequestMapping(value="/signOn") 
    public void myMethod() { 
     ...do something 
    } 
} 

Файл web.xml выглядит следующим образом:

<context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>classpath:application-context.xml</param-value> 
    </context-param> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <servlet> 
     <servlet-name>appServlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>classpath:servlet-context.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

Но myPointCut не получить срабатывает для MyMethod, если я не добавить следующее (импортируя корневой контекст) в сервлет-context.xml так:

<import resource="classpath:application-context.xml"/ > 

Может кто-нибудь сказать мне, почему это происходит ? Не все бобы, включая Aspect, PointCut и Advice, автоматически становятся доступными в контроллере к весне через контекстную иерархию?

+0

Вы используете maven? если да, можете ли вы поделиться частью тега сборки pom.xml? Может быть, вам нужно добавить aspectj builder для вашего pom.xml. – nsylmz

+0

Да, я использую Maven, вот моя сборка тег часть: ' \t \t \t \t \t <- Использование Java 1.6 вместо стандартного 1.5 в качестве источника/цели для \t \t \t \t JAVAC! компилятор -> \t \t \t \t \t \t \t Maven-компилятора плагин \t \t \t \t <Конфигурация> \t \t \t \t \t $ {javase.version} \t \t \t \t \t $ {javase.version} \t \t \t \t \t UTF-8 \t \t \t \t \t \t \t \t \t \t ' – jl276

+0

Я не знаком с AspectJ строителя. Для чего и как это может помочь решить проблему? – jl276

ответ

0

Добавить этот код в свой pom. Может быть, ваша проблема может решить.

<properties> 
    <aspectj.version>1.7.4</aspectj.version> 
    <java.version>1.7</java.version> 
</properties> 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>aspectj-maven-plugin</artifactId> 
      <version>1.5</version> 
      <dependencies> 
       <dependency> 
        <groupId>org.aspectj</groupId> 
        <artifactId>aspectjtools</artifactId> 
        <version>${aspectj.version}</version> 
       </dependency> 
      </dependencies> 
      <executions> 
       <execution> 
        <goals> 
         <goal>compile</goal> 
         <goal>test-compile</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <outxml>true</outxml> 
       <complianceLevel>${java.version}</complianceLevel> 
       <aspectLibraries> 
        <aspectLibrary> 
         <groupId>org.springframework</groupId> 
         <artifactId>spring-aspects</artifactId> 
        </aspectLibrary> 
       </aspectLibraries> 
       <source>${java.version}</source> 
       <target>${java.version}</target> 
      </configuration> 
     </plugin> 
    </plugins> 
</build>