gpt4 book ai didi

java - Spring 4 : MethodInvokingFactoryBean on a FactoryBean<> instance

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:10:48 26 4
gpt4 key购买 nike

我正在尝试使用 org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean 在 Spring 4 中创建一个 FreeMarker 配置,然后自定义生成的 freemarker.template.Configuration (改变算术引擎)。

我正在使用以下 XML 配置(简化):

<bean id="freemarkerConfiguration" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
<property name="templateLoaderPaths">...</property>
...
</bean>

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject" ref="freemarkerConfiguration" />
<property name="targetMethod" value="setArithmeticEngine" />
<property name="arguments" value="#{T(freemarker.core.ArithmeticEngine).CONSERVATIVE_ENGINE}" />
</bean>

它有效,但我在应用程序启动期间收到很多警告:

2015-02-27 13:53:03,321 [localhost-startStop-1] [:] WARN  support.DefaultListableBeanFactory - Bean creation exception on FactoryBean type check: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.beans.factory.config.MethodInvokingFactoryBean#0' defined in ServletContext resource [/WEB-INF/spring/freemarker.xml]: Cannot resolve reference to bean 'freemarkerConfiguration' while setting bean property 'targetObject'; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'freemarkerConfiguration': FactoryBean which is currently in creation returned null from getObject

我的理解是它发生是因为 FreeMarkerConfigurationFactoryBean实现 FactoryBean<> 界面。因此,这个 FactoryBean首先是“准备”,然后是FactoryBean.getObject()每当需要访问它创建的实际 bean ( freemarker.template.Configuration) 时调用。

似乎MethodInvokingFactoryBean在底层 bean 仍由 FreeMarkerConfigurationFactoryBean“准备”时被调用,导致 FreeMarkerConfigurationFactoryBean.getObject()返回 null并且方法调用失败。

我怀疑我收到了很多警告,因为 Spring 反复尝试调用该方法但失败了。在某个时刻,工厂生产的 bean 已准备就绪,并且方法调用有效。

所以:

  • 我的分析是否正确?
  • 为什么会这样?我认为依赖注入(inject)系统应该检测 MethodInvokingFactoryBean 之间的依赖关系和 freemarkerConfiguration ,并在工厂 bean 准备就绪后调用方法。我尝试添加 depends-on="freemarkerConfiguration"MethodInvokingFactoryBean 上但这没有帮助。
  • 有没有办法在 XML 中实现我想要的(我现在不能切换到 Java @Configuration)。基本上我需要一种方法来调用 freemarker.core.Configurable.setArithmeticEngine()来自 XML。

谢谢。

最佳答案

在阅读了一些规范后我发现了这个,希望对你有用:

<bean id="freemarkerConfiguration" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
<property name="templateLoaderPath" value="/WEB-INF/freemarker/"/>
<property name="freemarkerSettings">
<props>
<prop key="arithmetic_engine">conservative</prop>
</props>
</property>
</bean>

引用:Freemarker Docs

关于java - Spring 4 : MethodInvokingFactoryBean on a FactoryBean<> instance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28756934/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com