有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用bean引用从SpringXML配置迁移到@configuration(Servlet3.0)会导致BeanNotOfRequiredTypeException

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

我遇到了以下问题:我想创建一个新bean,它引用了另一个(服务)bean。因此,我自动连接这个类以在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试图自动连接代理类

我感谢你的帮助

致以最良好的祝愿, 丹尼尔


共 (1) 个答案

  1. # 1 楼答案

    当使用SpringRemoting时,它将为远程bean创建代理。这是为了隐藏所用技术的复杂性。因此,在您的例子中,它将构造一个实现StorageManager接口的代理,因此它将创建一个实现该接口的代理

    现在不仅适用于Spring远程处理,而且基本上也适用于Spring AOP,AOP与代理一起应用(如参考指南中所述)。因此,我怀疑您的StorageManagerBean周围有事务,默认情况下,这些事务会导致JDK动态代理。这个代理也是基于接口的

    简而言之,注入一个StoreManager实例,而不是一个StoreManagerBean实例