JavaConfig中的Spring Web Flow转换服务

时间:2014-07-14 18:14:22

标签: spring-mvc converter spring-webflow-2 spring-java-config

我已经开始在Spring Weblow中开发Web应用程序了。我们的想法是尽可能多地用Java编写,而不是用XML编写。所以我开始使用JavaConfig文件来进行MVC配置和Web Flow配置。但是当我需要转换器输入和提交带有Spring Web Flow的表单时,我遇到了一个问题。

我对ConversionService和Converters进行了大量研究。我找到了很多实现自定义ConversionService和自定义转换器的示例,但是我没有找到将ConversionService添加到JavaConfig中的Web Flow配置的示例(配置始终是XML)。

我确实尝试在Java中重现XML配置,这几乎起作用。在表单页面中,POJO(Employee)列表表示为下拉列表。输入为List<Employee>,转换器(StringToObject的子类)用于将每个Employee表示为String。但是在提交表单时,我收到的错误是找不到String to Employee的转换器。基本上,在渲染页面时找到并使用了自定义转换器,但在提交表单时,无法找到相同的转换器进行反向处理。

我最终通过将JavaConfig滚动回XML配置并将自定义Formatter添加到MVC配置的ConversionService来解决此问题。但是如果可能的话,我想在JavaConfig中完成这项工作。 我认为问题是需要将ConversionService bean(org.springframework.core.convert包)添加到MVC配置中,因为需要将此Bean设置为ConversionService bean中的委托ConversionService以添加到Web Flow Config(后者来自org.springframework.binding.convert包)。但我不知道如何在JavaConfig中添加这个核心ConversionService,如下面代码中的mvc:annotation-driven标记。

这一切都归结为需要以下代码的JavaConfig版本:

<mvc:annotation-driven conversion-service="typeConversionService" ... />

<bean id="typeConversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
     <property name="formatters">
       <list>
         <bean class="some.package.holidays.formatter.EmployeeFormatter">
           <constructor-arg ref="employeeService"/>
         </bean>
         <bean class="org.springframework.format.datetime.DateFormatter">
            <constructor-arg value="dd/MM/yyyy"/>
         </bean>

       </list>
     </property>
   </bean>

如果有人想知道Spring Webflow的JavaConfig,特别是关于添加ConversionService,请告诉我,这将是一个很好的帮助。

2 个答案:

答案 0 :(得分:4)

我在项目中有同样的事情要做,这就是我做到的。我知道你可能会迟到,但也许其他人需要这个答案:

@Configuration
public class WebFlowConfig extends AbstractFlowConfiguration {  

@Autowired
private MvcConfig webMvcConfig; 

@Bean
public FlowBuilderServices flowBuilderServices() {
    return getFlowBuilderServicesBuilder()
            .setViewFactoryCreator(mvcViewFactoryCreator())
            .setValidator(this.webMvcConfig.validator())
            .setConversionService(conversionService())
            .setDevelopmentMode(true)
            .build();
}

@Bean
DefaultConversionService conversionService() {
    return new DefaultConversionService(conversionServiceFactoryBean().getObject());
}


@Bean
FormattingConversionServiceFactoryBean conversionServiceFactoryBean() {
    FormattingConversionServiceFactoryBean fcs = new FormattingConversionServiceFactoryBean();
    Set<Formatter> fmts = new HashSet<>();
    fmts.add(this.webMvcConfig.dateFormatter());
    fmts.add(this.webMvcConfig.employeeFormatter());
    fcs.setFormatters(fmts);
    return fcs;
 } }

答案 1 :(得分:0)

我赞成了接受的答案,但也想补充一下。我一直收到以下错误。

'conversionService': Requested bean is currently in creation: Is there an unresolvable circular reference?

要解决此问题,请删除此类conversionService bean。 (注意setConversionService差异。)

@Bean
public FlowBuilderServices flowBuilderServices() {
    return getFlowBuilderServicesBuilder()
            .setViewFactoryCreator(mvcViewFactoryCreator())
            .setValidator(localValidatorFactoryBean)
            .setConversionService(new DefaultConversionService(conversionServiceFactoryBean().getObject()))
            .setDevelopmentMode(true)
            .build();
}

@Bean
FormattingConversionServiceFactoryBean conversionServiceFactoryBean() {
    FormattingConversionServiceFactoryBean fcs = new FormattingConversionServiceFactoryBean();
    Set<Formatter> fmts = new HashSet<>();
    fmts.add(this.webMvcConfig.dateFormatter());
    fmts.add(this.webMvcConfig.employeeFormatter());
    fcs.setFormatters(fmts);
    return fcs;
}