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