我正在尝试设置HostConfiguration bean。它具有的属性之一称为proxyHost。但是,Apache HostConfiguration类不遵循Java Bean约定。 proxyHost的setter接受类型为ProxyHost的参数,而getter返回字符串。

我的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或采用String的setter的getProxyHost,因此出现以下错误:-

org.springframework.beans.NotWritablePropertyException:Bean类[org.apache.commons.httpclient.HostConfiguration]的无效属性'proxyHost':Bean属性'proxyHost'是不可写的或具有无效的setter方法:该参数类型是否为setter匹配getter的返回类型?

在springsource论坛上搜索时,我遇到了这个thread,建议使用MethodInvokingFactoryBean来解决这个问题。

我不确定使用MethodInvokingFactoryBean有什么帮助,因为我需要从ProxyHost方法返回getProxyHost()的返回类型来解决此问题,对吗?我也不确定如何在这种情况下使用它。我不清楚MethodInvokingFactoryBean的内部。因此,如果有人可以在上述情况下给我一个示例,说明如何使用MethodInvokingFactoryBean,将有很大帮助。

这也是在 Spring 设置不遵循约定的Bean(如HostConfiguration)的公认方法吗?

谢谢!

最佳答案

首先,实例化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>

08-26 07:04