gpt4 book ai didi

java - Spring - 无法强制作为 CGLIB 代理的类转换异常

转载 作者:搜寻专家 更新时间:2023-11-01 03:29:03 24 4
gpt4 key购买 nike

这是让我发疯的场景。

  1. 我有一个具有查找方法的类 - createOther()
  2. createOther 应该创建一个 Other 类型的对象。其他实现 OtherInterface 并且还有一个方法 doSomething 标记为@Async
  3. 由于 Other 实现了 OtherInterface,Spring 为我提供了一个 JDK 代理,我无法将其转换为 Other。
  4. Spring 文档建议使用 <aop:config proxy-target-class="true"> - 但我是新手,使用它似乎没有帮助。

问题:我如何告诉 Spring 我需要一个以 Other 类为目标的 CGLib 代理?

下面的代码因类转换异常而失败。

    Exception in thread "main" java.lang.ClassCastException: $Proxy4 cannot be cast to scratch.Other
at scratch.App$$EnhancerByCGLIB$$82d16307.createOther(<generated>)
at scratch.App.main(App.java:19)

App.java:

public class App {
public Other createOther() {
throw new UnsupportedOperationException();
}

public static void main(final String[] args) {

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("appcontext.xml");
App app = (App) context.getBean("app");
Other oth = app.createOther();
oth.doSomething();
System.out.println("Other created");
}

** 其他.java **

public interface OtherInterface {

}

class Other implements OtherInterface {

@Async
public void doSomething() {
System.out.println("did something");
}
}

** appcontext.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:task="http://www.springframework.org/schema/task"
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/task http://www.springframework.org/schema/task/spring-task-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<aop:config proxy-target-class="true"></aop:config>
<bean name="app" class="scratch.App">
<lookup-method bean="otherBean" name="createOther" />
</bean>

<bean name="otherBean" class="scratch.Other" scope="prototype">
</bean>
<task:executor id="workflowExecutorSvcPool" pool-size="5-50"
queue-capacity="1000" keep-alive="60" />
<task:annotation-driven executor="workflowExecutorSvcPool" />

</beans>

最佳答案

一切似乎都很好——这是告诉 spring 使用 cglib 代理的正确方法。事实上,documentation states它会默认生成 cglib 代理。唯一的要求是在类路径中包含 cglib。确保您拥有 cglib jar。

关于java - Spring - 无法强制作为 CGLIB 代理的类转换异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5610516/

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