我们正在使用Spring MVC来创建Web应用程序,我们支持用户可以在Web应用程序中更改所需的区域设置。这一切都很好用,但我们遇到的问题似乎没有被Spring WebMVC覆盖(或者我们根本找不到它所在的部分)。
我们有几种使用的格式,根据HTML5规范将其日期格式化为“yyyy-mm-dd”。在不支持此功能的浏览器上,我们使用polyfill来显示日期选择器。日期选择器将日期格式化为特定于语言环境的表示,例如为德国“dd.mm.yyyy”。现在,当表单发送给我们时,我们得到它一次作为“yyyy-mm-dd”,另一次作为“dd.mm.yyyy”(当我们稍后支持更多语言环境时,甚至以更多不同的格式)。默认情况下,Spring MVC似乎无法处理这个问题。您可以在表单bean中指定@DateTimeFormat注释,但这只包含一种可能的格式,并且您不能添加多个这些注释。
因此我们深入挖掘并为日期编写了一个自定义属性编辑器,尝试以不同格式解析日期,并在找到拟合格式后返回解析日期。我们使用@InitBinder注释在控制器基类中注册了这个注释:
@InitBinder
public void initBinder(WebDataBinder binder) {
String outputFormat = messageSource.getMessage("generic.date.format", null, LocaleContextHolder.getLocale());
binder.registerCustomEditor(Date.class, new MultipleDateEditor(outputFormat, ACCEPTED_INPUT_FORMATS));
}
这基本上获取当前的语言环境,并使用适合当前调用者的语言环境的日期格式提供属性编辑器。实际上,这比使用Web框架时的预期更多。
当提交的表单包含错误并且我们需要将解析的日期打印回表单时,还有另一个问题。我们希望以与我们获得它相同的格式打印出值。使用属性编辑器,我们可以通过在内部记住我们用于解析日期的格式来再次使用此格式将日期格式化为字符串来解决此问题。同样,这看起来比使用Web框架时更多的工作。
我很想听听你解决这个问题的方法。这几乎是每个支持多种语言的Web应用程序都需要的,因此必须有一些标准化的方法或至少是最佳实践。