环境:
Spring 3.1.3.RELEASE
Spring webflow 2.3.0.RELEASE
我最近在spring源论坛上发布了这个问题。看到: Spring webflow formatting issue
我也遵循了参考文档中列出的步骤以及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流的验证器中处理解析日期。
谢谢, 巴蒂尔。
答案 0 :(得分:0)
更新2:
我发现为什么在我们的应用程序中吞下了异常,我们在验证时清除了消息上下文中的消息。
因此,如果日期格式化程序由于用户输入的值无效而引发异常,则spring会正常处理此异常,并在与该字段相关的消息上下文中创建四个错误消息键。例如,如果字段modifiedTermExpiryDate失败,将创建四个新密钥:
您需要做的就是在您的messages.properties中指定其中一个密钥和验证消息。
示例:
revisedTermExpiryDate.typeMismatch=Revised Term Expiry Date: DATE IS INVALID
解决!!