用于日期格式化的Spring webflow和类型转换

时间:2013-01-04 11:50:04

标签: spring spring-webflow date-formatting

环境:

Spring 3.1.3.RELEASE

Spring webflow 2.3.0.RELEASE

我最近在spring源论坛上发布了这个问题。看到: Spring webflow formatting issue

我也遵循了参考文档中列出的步骤以及stackoverflow中的最佳答案:

Answer

我希望当我的表单提交并发生绑定时,输入无效的日期值时会抛出一个解析异常。但我没有看到这种情况发生。

此外,如果抛出异常,如何处理它以在前端显示错误消息?

我想在我的应用程序中开始使用类型转换。我按照以下步骤配置spring MVC和SWF的类型转换格式。

我按照步骤添加到servlet上下文

<!-- Enables controllers mapped with @RequestMapping annotations, formatting annotations @NumberFormat
    @DateTimeFormat, and JSR 303 style validation --> 
   <mvc:annotation-driven conversion-service="applicationConversionService1" />

<webflow:flow-builder-services id="flowBuilderServices" conversion-service="defaultConversionService" view-factory-creator="mvcViewFactoryCreator" development="true"/>

<bean id="defaultConversionService" class="org.springframework.binding.convert.service.DefaultConversionService"> 
        <constructor-arg ref="applicationConversionService1"/> 
   </bean>

我创建了一个新类来注册我自己的格式化程序,以便在Spring MVC和Spring Web Flow中使用。

@Component(value = "applicationConversionService1")
public class ApplicationConversionServiceFactoryBean extends
        FormattingConversionServiceFactoryBean {

    @Override
    protected void installFormatters(FormatterRegistry registry) {
      // Register the default date formatter provided by Spring
      registry.addFormatter(new DateFormatter("dd/MM/yyyy"));
    } 

}

现在,当我部署到服务器时,上下文被正确初始化,类路径扫描注册了bean。

在我绑定的表单模型中,我使用新的dateformat注释注释了一个日期字段。

@DateTimeFormat(pattern="dd/MM/yyyy")
    private Date revisedTermExpiryDate = new Date();

更新: 我正在调试,因为我在我的类路径上有joda-time,我相信spring正在注册joda DateTimeFormatter,而解析并没有失败。

如果我实际上删除了注释,它会调用DateFormatter,它会按预期抛出解析异常,但是在框架中会吞下异常。

我的目标是使用全局默认日期注册普通的DateFormatter,严格解析(lenient = false)并优雅地处理任何解析异常。这对我而言是一个很好的功能,而不是在每个Web流的验证器中处理解析日期。

谢谢, 巴蒂尔。

1 个答案:

答案 0 :(得分:0)

更新2:

我发现为什么在我们的应用程序中吞下了异常,我们在验证时清除了消息上下文中的消息。

因此,如果日期格式化程序由于用户输入的值无效而引发异常,则spring会正常处理此异常,并在与该字段相关的消息上下文中创建四个错误消息键。例如,如果字段modifiedTermExpiryDate失败,将创建四个新密钥:

  1. recordDecisionFormModel.revisedTermExpiryDate.type不匹配
  2. revisedTermExpiryDate.typeMismatch
  3. java.util.Date.typeMismatch
  4. typeMismatch
  5. 您需要做的就是在您的messages.properties中指定其中一个密钥和验证消息。

    示例:

    revisedTermExpiryDate.typeMismatch=Revised Term Expiry Date: DATE IS INVALID
    

    解决!!