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

Spring static factory with factory-method and parameter

我在将代码传输到 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 为空!

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

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

我找到了专门针对我的问题的解决方案。

这里是 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>

所以我找到了一个幸运的"workaround"原题

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

谢谢!

这里需要使用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");

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

正如 Bond - Java Bond 所说的作品:

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

谢谢!!!