【问题标题】:whats is wrong with AOP using in Spring based project?在基于 Spring 的项目中使用 AOP 有什么问题?
【发布时间】:2013-12-04 18:14:21
【问题描述】:

似乎我通过谷歌从各种来源搜索信息以解决我的问题,但我仍然遇到麻烦。 为了澄清我的问题,我会尽可能多地为您提供信息。

我正在使用 NetBeans IDE 7.3.1 和 Spring 3.1.1。

我现在拥有的:

我创建了 6 个类和 1 个 xml 文件。

这些课程运行良好(因为这些课程基于我目前正在阅读的书)。

我想我的 jar 文件有问题(可能版本兼容性有问题或其他问题(idk,我是这个范围内的新手))。

XML 文件:

    <?xml version="1.0" encoding="UTF-8"?>
     <beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        **http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">**

        <bean id="knight" class="castle.BraveKnight">
        <constructor-arg ref = "quest"/>

        </bean>

        <bean id="quest"
              class="castle.SlayedDragonQuest"/>      

        <bean id="mistreal"
              class="castle.Mistreal"/>
        <aop:config>
            <aop:aspect ref="mistreal">
                <aop:pointcut id="embark"
                    expression="execution(* *.embarkQuest(..))" />
                <aop:before pointcut-ref="embark"
                        method="singBeforeQuest"/>
                <aop:after pointcut-ref="embark"
                    method="signAfterQuest"/>


              </aop:aspect>
              </aop:config>

 </beans>

编译我的代码后,我得到了这个:

线程“main”中的异常 org.springframework.beans.factory.BeanDefinitionStoreException:从类路径资源 [knight.xml] 解析 XML 文档时出现意外异常;嵌套异常是 java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice

很明显,classloader 找不到我的名为 Advice 的 aop 类。但是为什么呢?

我像这样在我的项目中添加了 jars:

我错过了什么吗?谁能给我一些信息。 (我阅读了相关资源,但结果是一样的)。

谢谢

已编辑:

我添加了 aopalliance.jar 文件,现在我得到了这个:

线程“main”中的异常 org.springframework.beans.factory.BeanCreationException:创建类路径资源 [knight.xml] 中定义的名称为“knight”的 bean 时出错:bean 实例化之前的 BeanPostProcessor 失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为 'org.springframework.aop.aspectj.AspectJPointcutAdvisor#1' 的 bean 时出错:无法创建 [org.springframework.aop 类型的内部 bean '(inner bean)' .aspectj.AspectJAfterAdvice] 设置构造函数参数时;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名称为“(内部 bean)#2”的 bean 时出错:无法创建类型为 [org.springframework.aop.config.MethodLocatingFactoryBean] 的内部 bean“(内部 bean)”在设置构造函数参数时;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名称为“(内部 bean)#2”的 bean 时出错:bean 初始化失败;嵌套异常是 java.lang.IllegalArgumentException:无法在 bean [mistreal] 上找到方法 [signAfterQuest] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:452) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)

似乎一种解决方案会引发另一个问题。我该如何解决? 附:我没有使用 Marven。这也是我图片中的一个错误,我在我的项目中修复了它,但它没有改变任何东西。

Mistreal 类:

    package castle;


public class Mistreal {

    public void singBeforeQuest(){
        System.out.println("Singing before quest");
    }

    public void singAfterQuest(){
        System.out.println("Singing after quest");
    }

}

【问题讨论】:

  • 不要关注 SPRING-AOP jar 文件中的 2 个不同版本(我删除了我的 3.0.7),所以现在我的项目中只添加了 3.0.0 版本。结果是一样的。
  • 向我们展示您的Mistreal 课程。
  • 你只是打错了,见下文。

标签: java spring aop


【解决方案1】:

是的,您需要 aopalliance 库,其中包含 org.aopalliance.aop.Advice 类等。您可以为 maven 获取它(或下载 jar),here。

如果您使用的是 Maven,那么 spring-aop 应该将其引入,因为 it is one of its dependencies。如果没有,您将不得不下载它(以及其他任何东西)并将其(它们)手动添加到您的类路径/构建路径中。

正如其他人所指出的,使用单个 spring-aop jar。

你有错别字

<aop:after pointcut-ref="embark"
                method="signAfterQuest"/>

在上面的切入点中,你使用了signAfterQuest,但是你的方法被调用了

public void singAfterQuest(){
    System.out.println("Singing after quest");
}

singAfterQuest。提示在日志中

Unable to locate method [signAfterQuest] on bean [mistreal] at 

对于新错误,Spring 默认使用 JDK 代理,但这些代理仅适用于接口。因此,您不能将代理注入到 class 类型的变量中。相反,您需要使用 CGLIB 代理来更改您的 XML 配置

<aop:config proxy-target-class="true">

这还需要您将 CGLIB 和相关库添加到您的类路径中。更多详细信息请参见 here 等相关答案。

【讨论】:

  • 天哪,真是个小错误。我讨厌那些人眼几乎看不见的小错误,谢谢。在此之后我得到:线程“main”中的异常 java.lang.ClassCastException: castle.$Proxy0 cannot be cast to castle.BraveKnight
  • @user 你需要开始帮助自己。请参阅我的编辑以了解如何修复它。
  • 我会接受这个答案,因为 AOP 的问题已解决(我猜),但现在上面有一个例外。你能帮我弄清楚吗?之后我会像赢家一样去^^
【解决方案2】:

我注意到你两者都有:

spring-aop-3.0.7.RELEASE.jar 和 spring-aop-3.0.0.RELEASE.jar

这是故意的吗?也许有某种冲突。

编辑:正如@SotiriosDelimanolis 指出的那样,您需要位于here 的aopalliance jar。 Maven 绝对是获取所需依赖项的好资源,而且易于使用。我建议调查一下。

【讨论】:

  • 很抱歉,我修复了它并删除了其中一个。我只留下了 3.0.0 版本
  • 我不知道如何使用 Marven,因为今天是我通过 Spring In Action 这本书使用 Spring 的第一天。我在使用 AOP 方法时遇到了问题。而现在,我花了 3 个多小时来寻找问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多