首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹簧静态工厂.方法和参数

弹簧静态工厂.方法和参数
EN

Stack Overflow用户
提问于 2015-02-13 08:38:24
回答 2查看 839关注 0票数 0

我在将代码转换到SpringapplicationContext.xml时遇到了问题

消息来源是:

代码语言:javascript
复制
File inFile = new File ("path/to/file/", "fileName.docx")    
WordprocessingMLPackage wordMLPackage = Docx4J.load(inFile);

我的解决办法是:

代码语言:javascript
复制
<bean id="inFile" class="java.io.File">
    <constructor-arg value="path/to/file/" />
    <constructor-arg value="fileName.docx" />
</bean>

<bean id="docx4j" class="org.docx4j.Docx4J" factory-method="load">
    <constructor-arg ref="inFile" />
</bean>

<bean id="wordprocessingMLPackage" class="org.docx4j.openpackaging.packages.WordprocessingMLPackage" factory-bean="docx4j" />

我从bean " WordprocessingMLPackage“中得到的确实是类WordprocessingMLPackage的一个实例,但是它似乎是空的,尽管我试图加载的文件不是(是的,路径是双倍的)。

当尝试

代码语言:javascript
复制
MainDocumentPart mdp = wordprocessingMLPackage.getMainDocumentPart();
List<Object> content = mdp.getContent();

我得到一个NullPointerException,因为mdp是空的!

有谁能想到..。甚至是解决方案?

============================================================

我找到了一个解决方案,特别是针对我的问题。

以下是Docx4j.load()的来源:

代码语言:javascript
复制
public static WordprocessingMLPackage load(File inFile) throws Docx4JException {
    return WordprocessingMLPackage.load(inFile);
}

这意味着我可以通过WordprocessingMLPackage的静态自我创建一个实例!

正在工作的守则:

代码语言:javascript
复制
<bean id="wordprocessingMLPackage" class="org.docx4j.openpackaging.packages.WordprocessingMLPackage" factory-method="load">
    <constructor-arg ref="baseDocument" />
</bean>

所以我为原来的问题找到了一个幸运的“解决办法”。

由于这个问题不再紧迫,我仍然对正确的解决方案感兴趣,特别是在允许在其他bean中注入WordprocessingMLPackage的解决方案中。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-13 09:44:34

在这里,您需要使用MethodInvokingFactoryBean,详见下文。

代码语言:javascript
复制
<bean id="beanId"
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetClass" value="org.docx4j.Docx4J" />

    <property name="targetMethod" value="load"/>
    <property name="arguments">
        <list>
            <ref bean="inFile" />               
        </list>
    </property>
</bean>

在您的代码中,获取applicationContext实例并调用下面的LOC

代码语言:javascript
复制
WordprocessingMLPackage ml = (WordprocessingMLPackage) applicationContext.getBean("beanId");

如果你面临任何问题,请在评论中告知。

票数 0
EN

Stack Overflow用户

发布于 2015-02-13 11:50:54

正如邦德-爪哇邦德所指出的那样,这是可行的:

代码语言:javascript
复制
<bean id="inFile" class="java.io.File">
    <constructor-arg value="path/to/file/" />
    <constructor-arg value="fileName.docx" />
</bean>

<bean id="beanId" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetClass" value="org.docx4j.Docx4J" />

    <property name="targetMethod" value="load"/>
    <property name="arguments">
        <list>
            <ref bean="inFile" />               
        </list>
    </property>
</bean>

现在,您可以将bean用作

代码语言:javascript
复制
WordprocessingMLPackage ml = (WordprocessingMLPackage) applicationContext.getBean("beanId");

或者您可以将bean直接注入到

代码语言:javascript
复制
<bean id="service" class="app.service.Service">
    <property name="wordprocessingMLPackage" ref="beanId" />
</bean> 

谢谢!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28495472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档