【问题标题】:Spring static factory with factory-method and parameter带有工厂方法和参数的 Spring 静态工厂
【发布时间】:2015-02-13 08:38:24
【问题描述】:

我在将代码传输到 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”中得到的确实是 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>

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

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

谢谢!

【问题讨论】:

    标签: spring methods parameters static factory


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,但你的代码 eclipse 说“类型不匹配:无法从 Object 转换为 WordprocessingMLPackage”。尝试强制转换此对象时,我收到“ClassCastException:无法强制转换为 org.springframework.beans.factory.config.MethodInvokingFactoryBean。”我找到了一个专门针对我的问题的解决方案。一会我就发上来……
    • 我用正确的演员编辑了帖子。它现在应该可以工作了。
    • 很遗憾没有。如上所述,我已经尝试过。当尝试将此对象转换为 WordProcessingMLPackage 时,我收到“ClassCastException:无法转换为 org.springframework.beans.factory.config.MethodInvokingFactoryBean。”
    • 您能否发布System.out.println(applicationContext.getBean("beanId")); 的输出? IIRC 它确实应该是MethodInvokingFactoryBean
    • 好收获! System.out.println(applicationContext.getBean("beanId")); 打印 org.docx4j.openpackaging.packages.WordprocessingMLPackage@162bd90 所以这段代码可以完成这项工作:WordprocessingMLPackage ml = (WordprocessingMLPackage) applicationContext.getBean("beanId");
    【解决方案2】:

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

    谢谢!!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      相关资源
      最近更新 更多