0

环境:

Spring 3.1.3.RELEASE

Spring webflow 2.3.0.RELEASE

我最近在 spring 源论坛上发布了这个问题。请参阅: Spring webflow 格式化问题

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

回答

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

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

我想开始在我的应用程序中使用类型转换。我按照以下步骤为 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 流处理解析日期。

谢谢,谢恩。

4

1 回答 1

0

更新 2:

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

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

  1. recordDecisionFormModel.revisedTermExpiryDate.type 不匹配
  2. 修订的TermExpiryDate.typeMismatch
  3. java.util.Date.typeMismatch
  4. 类型不匹配

您需要做的就是在您的 messages.properties 中使用您的验证消息指定这些键之一。

例子:

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

解决了!!

于 2013-01-08T17:03:15.073 回答