我正在使用具有属性可选传输协议的代理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应该可以正常工作。你知道怎么做这个工作吗?
答案 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">
- 全局更改