设置具有不明确的setter方法的bean的属性时遇到问题。
问题是HttpClient的hostConfiguration.host属性有3种可能的使用方法:
这是我的bean定义:
<bean id="primaryClient" class="org.apache.commons.httpclient.HttpClient">
<property name="hostConfiguration.host">
<bean class="org.apache.commons.httpclient.HttpHost" >
<constructor-arg value="somelink.com"/>
<constructor-arg value="443"/>
<constructor-arg>
<bean class="org.apache.commons.httpclient.protocol.Protocol">
<constructor-arg value="https"/>
<constructor-arg ref="sslProtocolSocketFactory"/>
<constructor-arg value="443"/>
</bean>
</constructor-arg>
</bean>
</property>
</bean>
这是堆栈:
引起:org.springframework.beans.factory.BeanCreationException:在类路径资源[spring / test-merchantlink-context.xml]中定义名为'primaryClient'的bean时出错:设置属性值时出错;嵌套异常是org.springframework.beans.PropertyBatchUpdateException;嵌套的PropertyAccessExceptions(1)是: PropertyAccessException 1:org.springframework.beans.TypeMismatchException:无法将类型[org.apache.commons.httpclient.HttpHost]的属性值转换为属性'hostConfiguration.host'的必需类型[java.lang.String];嵌套异常是java.lang.IllegalArgumentException:无法将类型[org.apache.commons.httpclient.HttpHost]的值转换为属性'host'所需的类型[java.lang.String]:找不到匹配的编辑器或转换策略
我该如何解决这个问题?我正在使用spring 2.5.6
答案 0 :(得分:4)
基本上,重载的setter违反了JavaBeans规范,因此spring不支持。您可以查看https://jira.spring.io/browse/SPR-4931了解详情。
由于您可能没有制作HttpClient而无法更改它,因此一种解决方案是使用工厂bean。这看起来像这样:
<bean id="httpClientFactory" class="my.package.HttpClientFactory"/>
<bean id="primaryClient" factory-bean="httpClientFactory" factory-method="create">
您将在create()
上实施my.package.HttpClientFactor
方法来设置并返回您的工厂。
如果要在XML配置中而不是在代码中设置特定参数,则可以将构造函数参数添加到my.package.HttpClientFactor
。
答案 1 :(得分:2)
您应该避免重载您希望能够使用IoC连接的属性设置器。如果你需要两个setter(逻辑上)相同的属性,你应该使用不同的setter名称...和javadoc注释来解释发生了什么。
http://forum.spring.io上存在描述相同问题的相同问题,更好的解决方案是重命名所有方法。
答案 2 :(得分:1)
您似乎必须明确指定预期的类名,以避免可用的多个setter之间存在歧义。
可能是这样的:
<bean id="primaryClient" class="org.apache.commons.httpclient.HttpClient">
<property name="hostConfiguration.host">
<bean class="org.apache.commons.httpclient.HttpHost" >
<constructor-arg type="java.lang.String">
<value>somelink.com</value>
</constructor-arg>
<constructor-arg type="int">
<value>443</value>
</constructor-arg>
<constructor-arg>
<bean class="org.apache.commons.httpclient.protocol.Protocol">
<constructor-arg value="https"/>
<constructor-arg ref="sslProtocolSocketFactory"/>
<constructor-arg value="443"/>
</bean>
</constructor-arg>
</bean>
</property>
</bean>