Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring 4:MethodInvokingFactoryBean对FactoryBean<&燃气轮机;实例_Java_Spring_Spring Mvc - Fatal编程技术网

Java Spring 4:MethodInvokingFactoryBean对FactoryBean<&燃气轮机;实例

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

我正试图在Spring4中使用
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
    freemarkerConfiguration
    之间的依赖关系,并在FactoryBean准备好后调用该方法。我试图在调用FactoryBean的
    方法中添加
    dependens=“freemarkerConfiguration”
    ,但没有帮助
  • 有没有一种方法可以实现我想要的XML格式(我现在无法切换到Java
    @Configuration
    )。基本上,我需要一种从XML调用
    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>