Java Spring 4:MethodInvokingFactoryBean对FactoryBean<&燃气轮机;实例
我正试图在Spring4中使用Java Spring 4:MethodInvokingFactoryBean对FactoryBean<&燃气轮机;实例,java,spring,spring-mvc,Java,Spring,Spring Mvc,我正试图在Spring4中使用org.springframework.ui.FreeMarker.FreeMarker配置FactoryBean创建一个FreeMarker配置,然后自定义生成的FreeMarker.template.configuration(以更改算术引擎) 我正在使用以下XML配置(简化): 我的理解是,这是因为FreeMarkerConfigurationFactoryBean实现了接口。因此,这个FactoryBean首先是“准备好的”,然后每当需要访问它创建的实际be
org.springframework.ui.FreeMarker.FreeMarker配置FactoryBean
创建一个FreeMarker配置,然后自定义生成的FreeMarker.template.configuration
(以更改算术引擎)
我正在使用以下XML配置(简化):
我的理解是,这是因为FreeMarkerConfigurationFactoryBean
实现了接口。因此,这个FactoryBean
首先是“准备好的”,然后每当需要访问它创建的实际bean(freemarker.template.Configuration
)时,就会调用FactoryBean.getObject()
当底层bean仍由FreeMarkerConfigurationFactoryBean
进行“准备”时,似乎调用了MethodInvokingFactoryBean
,导致FreeMarkerConfigurationFactoryBean.getObject()
返回null
,方法调用失败
我怀疑我收到了很多警告,因为Spring反复尝试调用该方法,但失败了。在某个时刻,工厂生成的bean已经准备就绪,方法调用也可以工作
因此:
- 我的分析正确吗
- 为什么会这样?我认为依赖注入系统应该检测
和MethodInvokingFactoryBean
之间的依赖关系,并在FactoryBean准备好后调用该方法。我试图在调用FactoryBean的freemarkerConfiguration
方法中添加
,但没有帮助dependens=“freemarkerConfiguration”
- 有没有一种方法可以实现我想要的XML格式(我现在无法切换到Java
)。基本上,我需要一种从XML调用@Configuration
的方法freemarker.core.Configurable.setArrithmeticEngine()
谢谢。一个
FactoryBean
应该创建一个bean,而不是对bean调用一个方法!另外,调用version的方法将尝试通过调用传递给创建新bean的对象的已配置方法来创建bean
相反,您应该查看FreeMarkerConfigurationFactoryBean的freemarkerSettings
属性,并设置包括算术引擎在内的属性:
<bean id="freemarkerConfiguration" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
<property name="templateLoaderPaths">...</property>
<property name="freemarkerSettings">
<map>
<entry key="#{T(freemarker.core.Configurable).ARITHMETIC_ENGINE_KEY}"
value="#{T(freemarker.core.ArithmeticEngine).CONSERVATIVE_ENGINE}"/>
</map>
</property>
...
</bean>
...
...
阅读一些规范后,我发现希望对您有用:
<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>
保守的
ref:我知道FactoryBean
是用来创建bean的,但我认为MethodInvokingFactoryBean
是对bean调用任意方法的推荐方法。它可以创建一个bean,是的,但它也支持调用不返回值的方法。有没有更好的方法来调用bean上的任意方法(不是属性),或者您不应该这样做?我不确定我是否理解您对FreeMarkerConfigurationFactoryBean
的configuration
属性的意思。从Javadoc上看,这个bean没有这样的属性?它支持设置一些属性(templateLoaderPath
,freemarkerSettings
,等等),但不支持设置我需要的属性(算术引擎)。抱歉,这不是指配置,而是使用freemarkerSettings“我认为MethodInvokingFactoryBean是在bean上调用任意方法的推荐方法”否,它还可以通过调用一个方法来创建一个bean!谢谢,但不幸的是仍然没有骰子。当FreeMarker代码尝试读取算术引擎键的值时,我在FreeMarker代码中得到一个NullPointerException
。在任何情况下,我都不确定这是否有效,因为freemarkerSettings
实际上是一个java.util.Properties
(不是Map
)并查看freemarker.core.Configurable.setSettings()
的代码,它显然需要字符串
值。我的问题是我需要传递对象(算术引擎,但我还有一个自定义的模板异常处理程序需要配置)。我试图用一个简单的项目重现您的问题,但没有任何类型的警告,我使用了:spring版本:4.1.1,freemarker:2.3.20唯一的日志信息是:org.springframework.ui.freemarker.SpringTemplateLoader。SpringTemplateLoader for FreeMarker:使用资源加载器[WebApplicationContext for namespace'mvc dispatcher servlet]:启动日期[…];上下文层次结构的根]和模板加载器路径[/WEB-INF/FreeMarker/]不知道它是否对您有用,但如果您需要所有配置文件,我可以在回答中发布它。(pom.xml、spring.xml、web.xml…)感谢您的接受。我还有另一个建议:尝试配置:foo.bar.MyTemplateExceptionHandler您的异常处理程序必须具有从上下文填充的实例字段,请参见示例:公共类MyTemplateExceptionHandler实现TemplateExceptionHandler{static ApplicationContext context=new ClassPathXmlApplicationContext(“spring config.xml”);公共静态MyTemplateExceptionHandler实例=context.getBean(MyTemplateExceptionHandler.class);[…]}这项针对2.3.21版之后的对象生成器表达式的工作非常有效,谢谢。问题是我使用了算术引擎使问题更易于描述:)但我实际上需要的是注入一个自定义模板异常处理程序,它是一个Springbean。我想我应该在问题中提到这一点!我不能在这里使用这种方法,因为FreeMarker可以为这些设置构造对象,但它不能引用Springbean。不过这解决了我最初的问题,所以我将访问快点,谢谢!
<bean id="freemarkerConfiguration" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
<property name="templateLoaderPaths">...</property>
<property name="freemarkerSettings">
<map>
<entry key="#{T(freemarker.core.Configurable).ARITHMETIC_ENGINE_KEY}"
value="#{T(freemarker.core.ArithmeticEngine).CONSERVATIVE_ENGINE}"/>
</map>
</property>
...
</bean>
<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>