当前位置: 首页 > 知识库问答 >
问题:

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

平元明
2023-03-14

当设置具有模糊setter方法的bean的属性时,我遇到了一个问题。

问题是主机配置。HttpClient的host属性有3种可能的使用方法:

  1. 主机配置。setHost(字符串主机)

这是我的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:错误创建的bean与名称'主客户端'定义在类路径资源[Spring/test-merchantlink-context.xml]:错误设置属性值;嵌套异常是org.springframework.beans.属性BatchUpdateException;嵌套属性访问异常(1)是:属性访问异常1:org.springframework.beans.类型错误匹配异常:无法将属性值的类型[org.apache.commons.httpclient.HttpHost]转换为所需的类型[java.lang.字符串]属性'主机Configuration.host';嵌套异常是java.lang.IllegalArgumentException:无法将类型[org.apache.commons.httpclient.HttpHost]的值转换为所需的类型java.lang.[字符串]属性'主机':没有找到匹配的编辑器或转换策略

我怎么能避开这个?我用的是Spring 2.5.6

共有3个答案

浦德明
2023-03-14

似乎必须显式指定预期的类名,以避免多个可用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>
景英杰
2023-03-14

您应该避免重载希望能够使用IoC连接的属性设置器。当(逻辑上)同一个属性确实需要两个setter时,应该使用不同的setter名称。。。和javadoc注释来解释发生了什么。

同样的问题http://forum.spring.io这说明了同样的问题,更好的解决方案是重命名所有方法。

链接1

链接2

链接3

曾丰茂
2023-03-14

基本上,重载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">

您将在HttpClientFactor上实现create()方法my.package.设置并返回您的工厂。

如果要在XML配置中而不是在代码中设置特定参数,可以将构造函数参数添加到my。包裹HttpClientFactor。

 类似资料:
  • 我正在使用mapstruct从一个DTO映射到另一个DTO。我有多个默认方法,但其中两个返回值为String,并且使用了与输入参数相同的类,这给了我“使用java MapStruct的mapping methods不明确”的错误。我在这里添加代码的相关部分: 错误是 发现将属性“Program ProgramInstance”映射到java.lang.String的映射方法不明确:java.lan

  • 我和jee和wildfly一起工作了几天,现在我有问题了。我创建了这样的东西: 接下来,我尝试在jsf中使用,但遇到了异常: 2017-05-23 08:49:07,447]工件EAR:EAR:工件部署过程中出错。有关详细信息,请参阅服务器日志。 > 带有限定符[@default@named@any]的生产者方法[List]声明为[[BackedAnnotatedMethod]@produces@

  • 有两种类型的对象属性。 第一种是 数据属性。我们已经知道如何使用它们了。到目前为止,我们使用过的所有属性都是数据属性。 第二种类型的属性是新东西。它是 访问器属性(accessor properties)。它们本质上是用于获取和设置值的函数,但从外部代码来看就像常规属性。 Getter 和 setter 访问器属性由 “getter” 和 “setter” 方法表示。在对象字面量中,它们用 get

  • 这是我的实用程序java文件: Spring-servlet.xml: 当我运行时,我得到以下错误: org.springframework.beans。NotWritablePropertyException:bean类[com.chrysler.Utilities.HibernateUtil]的属性“sessionFactory”无效:bean属性“sesionFactory'不可写或具有无效

  • 我知道这个问题已经被问了很多次,但在我看来一切都是正确的。我还从Eclipse中删除了我的代码,让IDE创建getter/setter,但没有用。 这是我在网络逻辑中的错误: 原因:豆类属性“gpsDataAllStopsSql”无效:bean 类的属性“gpsDataAllStopsSql”无效:bean 属性“gpsDataAllSTopsSql”无效,或者具有无效的 setter 方法。二极

  • 问题内容: A类提供一个字符串值。类B在其内部具有两个A类型的成员,并提供一个计算属性“ v”来选择其中之一。 这段代码很简单,可以正常工作。由于A和B都具有成员“值”,因此我将其设为这样的协议: 如果我更改以下代码 至 它再次起作用! 这是Swift的错误,还是协议属性的特殊之处? 问题答案: 您必须将协议定义为协议: 然后 编译并按预期方式工作(即,将新值分配给if 所引用的对象,否则分配给否