gpt4 book ai didi

java - 使用bean引用从spring xml配置迁移到@Configuration(servlet 3.0)会导致BeanNotOfRequiredTypeException

转载 作者:行者123 更新时间:2023-12-01 23:03:51 25 4
gpt4 key购买 nike

我正在使用相应的 @Configuration 注释从基于 xml 的 spring 配置迁移到基于“类”的配置。

我遇到了以下问题:我想创建一个新的 bean,它引用另一个(服务)bean。因此,我 Autowiring 了此类以在 bean 创建期间设置此引用。我的配置类如下所示:

@Configuration
@ComponentScan(basePackages = {"com.akme"})
public class ApplicationContext {

@Resource
private StorageManagerBean storageManagerBean;

@Bean(name = "/storageManager")
public HessianServiceExporter storageManager() {
HessianServiceExporter hessianServiceExporter = new HessianServiceExporter();
hessianServiceExporter.setServiceInterface(StorageManager.class);
hessianServiceExporter.setService(storageManagerBean);
return hessianServiceExporter;
}
}

但这不起作用,因为这会在启动期间导致 BeanNotOfRequiredTypeException 异常。

Bean named 'storageManagerBean' must be of type [com.akme.StorageManagerBean], but was actually of type [com.sun.proxy.$Proxy20]

StorageManagerBean 使用 @Service 注释进行注释。基于 xml 的配置按预期工作:

<bean name="/storageManager" class="org.springframework.remoting.caucho.HessianServiceExporter">
<property name="service" ref="storageManagerBean"/>
<property name="serviceInterface" value="com.akme.StorageManager"/>
</bean>

所以,我不知道我做错了什么以及为什么 spring 尝试自动连接代理类。

感谢您的帮助。

最诚挚的问候,丹尼尔

最佳答案

当使用 Spring Remoting 时,它将为远程 bean 创建代理。这是为了隐藏所使用技术的复杂性。因此,在您的情况下,它将构造一个实现 StorageManager 接口(interface)的代理,因此它将创建一个实现该接口(interface)的代理。

现在,不仅适用于 Spring Remoting,而且基本上也适用于 Spring AOP,AOP 与代理一起应用(如引用指南中所述)。所以我怀疑您的 StorageManagerBean 周围有事务,默认情况下,它会导致 JDK 动态代理。该代理同样是基于接口(interface)的。

简而言之,注入(inject)一个 StoreManager 实例而不是 StoreManagerBean 实例。

关于java - 使用bean引用从spring xml配置迁移到@Configuration(servlet 3.0)会导致BeanNotOfRequiredTypeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23080114/

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