1

我有一個XMLConfiguration中bean來加載SystemProperty.xml文件,如下使用的MethodInvokingFactoryBean爲XMLConfiguration中裝載文件中的Spring bean

<bean 
    id="xmlConfiguration" 
    class="org.apache.commons.configuration.XMLConfiguration" 
    lazy-init="true"> 
    <constructor-arg type="java.lang.String"> 
     <value>SystemProperty.xml</value> 
    </constructor-arg> 
    <property name="expressionEngine"> 
     <bean class="org.apache.commons.configuration.tree.xpath.XPathExpressionEngine" /> 
    </property> 
</bean> 

它工作正常,但是,我必須delimiterParsingDisabled在XMLConfiguration中設置爲true,所以我換豆添加一個propery delimiterParsingDisabled

<bean 
    id="xmlConfiguration" 
    class="org.apache.commons.configuration.XMLConfiguration" 
    lazy-init="true"> 
    <constructor-arg type="java.lang.String"> 
     <value>SystemProperty.xml</value> 
    </constructor-arg> 
    <property name="expressionEngine"> 
     <bean class="org.apache.commons.configuration.tree.xpath.XPathExpressionEngine" /> 
    </property> 
    <property name="delimiterParsingDisabled"> 
     <value type="java.lang.Boolean">true</value> 
    </property> 
</bean> 

但是,這將無法正常工作。由於setDelimiterParsingDisabled()必須在文件加載之前調用。因此,我已要求setDelimiterParsingDisabled()

我已經使用了MethodInvokingFactoryBean這種方式後打電話到XMLConfiguration中的load(String fileName),但得到任何異常,如下

org.apache.commons.configuration.ConfigurationException: No file name has been set! 
at org.apache.commons.configuration.AbstractFileConfiguration.save(AbstractFileConfiguration.java:409) 
at org.apache.commons.configuration.AbstractHierarchicalFileConfiguration.save(AbstractHierarchicalFileConfiguration.java:214) 
at devicemanage.system.SystemConfigurationServiceImpl.saveSystemProperty(SystemConfigurationServiceImpl.java:232) 
at datacollection.service.DataCollectionServiceImpl.syncWithDataCollection(DataCollectionServiceImpl.java:786) 
at devicemanage.utility.SyncWithDCListener$1.run(SyncWithDCListener.java:51) 

看來,該文件不被設置成XMLConfiguration中,我MethodInvokingFactoryBean已經說明如下

<bean id="xmlConfigurationMethodInvokingBean" 
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject" ref="xmlConfiguration" /> 
    <property name="targetMethod" value="load" /> 
    <property name="arguments" value="SystemProperty.xml" /> 
</bean> 

和原因,改變我的xmlConfiguration豆不加載文件,而新的構造如下

<bean 
    id="xmlConfiguration" 
    class="org.apache.commons.configuration.XMLConfiguration" 
    lazy-init="true"> 
    <property name="expressionEngine"> 
     <bean class="org.apache.commons.configuration.tree.xpath.XPathExpressionEngine" /> 
    </property> 
    <property name="delimiterParsingDisabled"> 
     <value type="java.lang.Boolean">true</value> 
    </property> 
</bean> 

不知道的是,我有錯的方式來使用MethodInvokingFactoryBean或我已經使用的參數傳遞一個文件名字符串錯誤到load()

任何幫助表示讚賞。

回答

1

第一種方式

我建議你創建自己的繼承類,並聲明init-method

package beans; 

import org.apache.commons.configuration.ConfigurationException; 
import org.apache.commons.configuration.XMLConfiguration; 

public class CustomXMLConfiguration extends XMLConfiguration { 

    private String loadFileName; 

    private void init() throws ConfigurationException { 
     this.load(fileName); 
    } 

    public String getLoadFileName() { 
     return loadFileName; 
    } 

    public void setLoadFileName(String fileName) { 
     this.loadFileName = fileName; 
    } 
} 

而進入配置,你可以使用這個類以下列方式:

<bean id="xmlConfiguration" class="beans.CustomXMLConfiguration" lazy-init="true" 
          init-method="init"> 
    <property name="expressionEngine"> 
     <bean class="org.apache.commons.configuration.tree.xpath.XPathExpressionEngine" /> 
    </property> 
    <property name="delimiterParsingDisabled"> 
     <value type="java.lang.Boolean">true</value> 
    </property> 
    <property name="loadFileName" value="SystemProperty.xml"/> 
</bean> 

init()方法將在Bean啓動後立即調用alized。

您可以使用MethodInvokingBeanclass豆方式二

。這個類的bean只是調用目標的方法:

<bean class="org.springframework.beans.factory.config.MethodInvokingBean"> 
    <property name="targetObject" ref="xmlConfiguration"/> 
    <property name="targetMethod" value="load"/> 
    <property name="arguments" value="SystemProperty.xml"/> 
</bean> 

個人而言,我更喜歡第一個變體,因爲更靈活的定製化並沒有bean的實例冗餘。但你可以選擇任何人。

希望這會有所幫助。

+0

嗨,肯,謝謝你的回答!它運作良好。 – Bruce

+0

@布魯斯歡迎您。 –

相關問題