gpt4 book ai didi

java - 使用 MethodInvokingFactoryBean for XMLConfiguration 在 Spring bean 中加载文件

转载 作者:行者123 更新时间:2023-11-30 07:33:08 24 4
gpt4 key购买 nike

我有一个 xmlConfiguration bean 来加载 SystemProperty.xml 文件,如下所示

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

它工作正常,但是,我必须在 XMLConfiguration 中将 delimiterParsingDisabled 设置为 true,因此我更改 bean 以添加属性 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()

之后调用 XMLConfiguration 的 load(String fileName)

我已经使用了MethodInvokingFactoryBean来实现这种方式,但出现了如下异常

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 更改为在新建构造函数时不加载文件,如下所示

<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 的方式错误,还是在将 fileName 字符串传递给 load() 时使用参数时出现错误

>

感谢任何帮助。

最佳答案

第一种方法

我建议您创建自己的继承类并声明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初始化后立即调用。

第二种方式

您可以使用MethodInvokingBean的bean class 。该类的 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 实例。但你可以选择任何人。

希望这会有所帮助。

关于java - 使用 MethodInvokingFactoryBean for XMLConfiguration 在 Spring bean 中加载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35790293/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com