如何在春天连接代理对象?

时间:2011-01-21 16:41:11

标签: java spring rmi

我正在使用具有属性可选传输协议的代理bean。我的问题是bean属性无法转换,但我真的不知道为什么。情况就是这样:

我的属性:service.protocol = rmi

<!-- This is the 'multiplexing' factory bean (using this because properties
cannot be used in bean names and aliases -->

   <bean name="dbFormGenWindowComponent" 
  class="org.springframework.beans.factory.config.BeanReferenceFactoryBean">
  <property name="targetBeanName" value="dbFormGenWindowComponent-${service.protocol}invoker" />
 </bean>

<!-- Here are the service invoker beans with two protocols: -->

  <bean name="dbFormGenWindowComponent-rmiinvoker" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
 <property name="serviceUrl" value="${ringwindow.serviceURL.rmi}/${ringwindow.service.name}-dbFormGenWindowComponent"/>
 <property name="serviceInterface" value="foo.bar.service.formgen.windows.FormGenWindowComponent" />
 <property name="lookupStubOnStartup" value="false"/>
  </bean>

  

启动时的例外是:

  

org.springframework.beans.TypeMismatchException:   无法转换属性值   输入所需类型的[$ Proxy541]   [foo.bar.service.formgen.windows.FormGenWindowComponent]   属性'formGenWindowComponent';   嵌套异常是   java.lang.IllegalArgumentException异常:   无法转换类型的值   [$ Proxy541]到所需类型   [foo.bar.service.formgen.windows.FormGenWindowComponent]   对于属性'formGenWindowComponent':   没有匹配的编辑器或转换   战略发现

我认为嵌套的工厂bean应该可以正常工作。你知道怎么做这个工作吗?

1 个答案:

答案 0 :(得分:3)

当您将注入点类型定义为具体类而不是接口,但通常是基于接口代理时,通常会发生这种情况。例如:

public interface Foo { .. }
public class FooImpl { .. } // this is declared as bean

public class Bar {
    private FooImpl foo; // this fails
    private Foo foo; // correct way
}

对于工厂bean,这可能是由于工厂bean的返回类型被定义为具体类。如果您无法更改类中的任何内容,则可以将spring配置为使用cglib-proxying,通过:

  • <aop:scoped-proxy> - 在bean定义中 - 这将配置bean的代理
  • <aop:aspectj-autoproxy proxy-target-class="true"> - 全局更改