在maven编译的项目中使用Spring AOP得到“没有工厂方法'aspectOf()'”发现异常

时间:2014-03-07 20:10:01

标签: java spring maven spring-aop aspectj-maven-plugin

我继承了一个使用Spring AOP的webapps代码库。 Maven用于编译它,在Tomcat 6.x服务器上运行。我试过通过Eclipse的“Run As”运行项目&也可以在命令行上运行mvn clean install&然后更新tomcat webapps文件夹。两者都曾经给我同样的例外。

SEVERE: Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.xyz.ABCAspect#0' defined in ServletContext resource [/WEB-INF/rest-servlet.xml]: No matching factory method found: factory method 'aspectOf()'. Check that a method with the specified name exists and that it is static.

我对Spring AOP很新,实际上是AOP。经过一些研究后,我通过将项目转换为AspectJ项目来通过Eclipse运行服务器时能够解决这个问题。在这样做之后,我停止了这些错误。

这对我来说似乎很神奇。而且由于我在进行手动编译/部署时仍面临同样的问题,因此我希望能够将其归零。解决这个问题。

以下是我的WEB-INF/rest-servlet.xml

的摘要
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:mvc="http://www.springframework.org/schema/mvc"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xmlns:ehcache="http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring"
   xmlns:p="http://www.springframework.org/schema/p"
   xsi:schemaLocation="
   http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring
   http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring/ehcache-spring-1.1.xsd
   http://www.springframework.org/schema/aop
   http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
   http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context-3.0.xsd
   http://www.springframework.org/schema/mvc
   http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

<aop:aspectj-autoproxy/>

<bean class="com.xyz.rest.aop.ABCAspect" factory-method="aspectOf">
    <property name="converter" ref="defaultConverter"/>
</bean>

这是我的ABCAspect

@Aspect
public class ABCAspect {

    private Converter converter;

    @Around("execution(@com.xyz.converter.DTOType * *(..)) && @annotation(dtoType)")
    public Object convertType(ProceedingJoinPoint pjp, DTOType dtoType) throws Throwable {
        //...
    }
    ...
}

以下是我的pom.xml

的摘要
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>aspectj-maven-plugin</artifactId>
        <version>1.4</version>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>       <!-- use this goal to weave all your main classes -->
              <goal>test-compile</goal>  <!-- use this goal to weave all your test classes -->
            </goals>
          </execution>
        </executions>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>

            <outxml>true</outxml>
            <showWeaveInfo>false</showWeaveInfo>
            <Xlint>warning</Xlint>
            <verbose>true</verbose>

        </configuration>
    </plugin>

令我感到困惑的是,在我宣布我的项目为AspectJ性质之后发生了什么是如此神奇?那次日食引发了抱怨。

任何指示赞赏。

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。发生这种情况是因为我将<plugins>包裹在<pluginManagement>标记中。

我删除它之后,我的aspectj插件开始正常工作,就像开始执行一样。有关此检查的详细信息this stackoverflow question