我已经开始在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,请告诉我,这将是一个很好的帮助。
答案 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;
}