不明确的setter方法导致分配属性值的问题

时间:2014-08-15 22:52:04

标签: java spring javabeans configuration-files

设置具有不明确的setter方法的bean的属性时遇到问题。

问题是HttpClient的hostConfiguration.host属性有3种可能的使用方法:

  1. HostConfiguration.setHost(String host)
  2. HostConfiguration.setHost(HttpHost主机)
  3. HostConfiguration.setHost(URI host)
  4. 这是我的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

3 个答案:

答案 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上存在描述相同问题的相同问题,更好的解决方案是重命名所有方法。

Link1

Link2

Link3

答案 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>