2011-03-23 69 views
5

我正在尝试设置HostConfiguration bean。其中一个物业叫做proxyHost。但是,Apache HostConfiguration类不遵循java bean约定。 proxyHost的setter接受ProxyHost类型的参数,而getter返回String。使用MethodInvokingFactoryBean设置非常规bean

我的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以下错误没有一个getProxyHost返回一个ProxyHost的或,需要一个String一个setter: -

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

虽然对我碰到这个thread来到那里它被推荐使用MethodInvokingFactoryBean解决这个SpringSource的论坛搜索。

我并不确定如何使用MethodInvokingFactoryBean会有帮助,因为我需要从方法getProxyHost()中返回ProxyHost来解决此问题,对吧?而且我也不确定如何在这种情况下使用它。我不清楚MethodInvokingFactoryBean的内部结构。因此,如果有人可以请给我一个例子在上述的情况下如何使用MethodInvokingFactoryBean这将是巨大的帮助。

另外,这通常是可以接受的方式来建立像HostConfiguration豆不遵循春季公约?

谢谢!

+0

可能重复[如何使用Spring注入在那不遵循Java bean的规范制定者的物体?](http://stackoverflow.com/questions/1215048/how -to-使用弹簧对注入-AN-对象功能于一设定器 - 即-犯规-后续的-java的-BEA) – skaffman 2011-03-23 08:51:57

回答

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

正如在其他答案中提到的,你可以实现一个FactoryBean。如果您使用的是spring 3.0,则还可以查看Java Configuration - @Configuration/@Bean。