带有工厂方法和参数的弹簧静态工厂

时间:2015-02-13 08:38:25

标签: spring methods parameters static factory

我在将代码传输到Spring applicationContext.xml

时遇到问题

来源是:

File inFile = new File ("path/to/file/", "fileName.docx")    
WordprocessingMLPackage wordMLPackage = Docx4J.load(inFile);

我的工作解决方案是:

<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”确实是Class WordprocessingMLPackage的一个实例,但它似乎是空的虽然我试图加载的文件不是(并且是的,路径是双重检查)。

尝试时

MainDocumentPart mdp = wordprocessingMLPackage.getMainDocumentPart();
List<Object> content = mdp.getContent();

我收到NullPointerException,因为mdp为null!

有人有想法......甚至是解决方案?

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

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

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

public static WordprocessingMLPackage load(File inFile) throws Docx4JException {
    return WordprocessingMLPackage.load(inFile);
}

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

正在运作的代码:

<bean id="wordprocessingMLPackage" class="org.docx4j.openpackaging.packages.WordprocessingMLPackage" factory-method="load">
    <constructor-arg ref="baseDocument" />
</bean>

所以我找到了原始问题的幸运“解决方法”。

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

谢谢!

2 个答案:

答案 0 :(得分:0)

您需要在此处使用MethodInvokingFactoryBean,详情如下。

<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

WordprocessingMLPackage ml = (WordprocessingMLPackage) applicationContext.getBean("beanId");

如果您遇到任何问题,请在评论中说明。

答案 1 :(得分:0)

作为邦德 - 爪哇邦德表示这有效:

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

WordprocessingMLPackage ml = (WordprocessingMLPackage) applicationContext.getBean("beanId");

或者您可以直接注入bean

<bean id="service" class="app.service.Service">
    <property name="wordprocessingMLPackage" ref="beanId" />
</bean> 

谢谢!!!