2011-03-23 18 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。