gpt4 book ai didi

java - 在基于Spring的项目中使用AOP有什么问题?

转载 作者:太空宇宙 更新时间:2023-11-04 15:21:04 25 4
gpt4 key购买 nike

看来我通过google从各种来源搜索了信息来解决我的问题,但我仍然遇到麻烦。为了澄清我的问题,我将向您提供尽可能多的信息。

我使用的是 NetBeans IDE 7.3.1 和 Spring 3.1.1。

我现在拥有的:

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

这些类(class)运行良好(因为这些类(class)基于我当前正在阅读的书)。

我想我的 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

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

我将 jar 添加到我的项目中,如下所示:

enter image description here

我错过了什么吗?任何人都可以给我一些信息。 (我阅读了相关资源,但结果是相同的)。

谢谢

编辑:

我添加了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“(内部bean)” .aspectj.AspectJAfterAdvice] 设置构造函数参数时;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名称为“(inner bean)#2”的 bean 时出错:无法创建类型为 [org.springframework.aop.config.MethodLocatingFactoryBean] 的内部 bean“(inner bean)”设置构造函数参数时;嵌套异常是 org.springframework.beans.factory.BeanCreationException: 创建名称为“(inner 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)

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

密斯特里尔级:

    package castle;


public class Mistreal {

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

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

}

最佳答案

是的,您需要 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 代理,但这些代理仅适用于接口(interface)。因此,您不能将代理注入(inject)到 class 类型的变量中。相反,您需要使用 CGLIB 代理来更改 XML 配置

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

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

关于java - 在基于Spring的项目中使用AOP有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20382799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com