我正在尝试设置HostConfiguration bean。它拥有的一个属性称为proxyHost
。但是,apache HostConfiguration类不遵循java bean约定。 proxyHost的setter接受类型为ProxyHost的参数,而getter返回一个String。
我的applicationContext.xml
中有以下代码段。
<bean id="proxyHost" class="org.apache.commons.httpclient.ProxyHost">
<constructor-arg index="0" type="java.lang.String" value="myproxy.com" />
<constructor-arg index="1" type="int" value="8087" />
</bean>
<bean id="hostConfiguration" class="org.apache.commons.httpclient.HostConfiguration">
<property name="proxyHost" ref="proxyHost" />
</bean>
当我尝试为应用程序加载applicationContext时,我收到以下错误,因为HostConfigurationClass
没有返回ProxyHost的getProxyHost
或带有字符串的setter: -
org.springframework.beans.NotWritablePropertyException:bean类的属性'proxyHost'无效[org.apache.commons.httpclient.HostConfiguration]:Bean属性'proxyHost'不可写或者setter方法无效:参数是否参数setter的类型与getter的返回类型匹配?
在泉源论坛上搜索时,我遇到了thread,建议使用MethodInvokingFactoryBean来解决此问题。
我不确定使用MethodInvokingFactoryBean
如何提供帮助,因为我需要方法ProxyHost
的返回类型getProxyHost()
才能解决此问题,对吧?而且我不确定如何在这种情况下使用它。我不清楚MethodInvokingFactoryBean
的内部。因此,如果有人可以请在上面的背景下给我一个例子,如何使用MethodInvokingFactoryBean
这将是非常有帮助的。
这通常是设置像HostConfiguration
这样的bean在春天不符合惯例的公认方法吗?
谢谢!
答案 0 :(得分:9)
首先,实例化ProxyHost
(即ProxyHost proxyHost = new ProxyHost("myproxy1.com",8080);
<bean id="proxyHost" class="org.apache.commons.httpclient.ProxyHost">
<constructor-arg index="0" type="java.lang.String" value="myproxy1.com" />
<constructor-arg index="1" type="int" value="8088" />
</bean>
然后实例化HostConfiguration
对象
(即HostConfiguration hostConfiguration = new HostConfiguration();
<bean id="hostConfiguration" class="org.apache.commons.httpclient.HostConfiguration" />
之后,使用MethodInvokingFactoryBean
致电setProxyHost()
上的HostConfiguration
并传递proxyHost
作为参数。
(即hostConfiguration.setProxyHost(proxyHost);
)
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject">
<ref local="hostConfiguration"/>
</property>
<property name="targetMethod">
<value>setProxyHost</value>
</property>
<property name="arguments">
<ref local="proxyHost"/>
</property>
</bean>
答案 1 :(得分:1)
如其他答案所述,您可以实施FactoryBean。如果您使用的是Spring 3.0,还可以查看Java Configuration - @Configuration / @Bean。