更近期的Spring框架版本引入了转换和格式化服务来处理这些任务,但不幸的是,报告的问题仍然存在:默认的无法正确地将空字符串转换为null Date对象。我发现非常烦人的是,Spring文档包含了一个日期格式化程序片段示例,其中实现了适当的防护条款用于两种转换(从和到字符串)。框架实现与框架文档之间的差异真的让我发疯,以至于我甚至可以在找到一些时间投入到任务中时提交一个补丁。
与此同时,我建议在使用现代版本的Spring框架时遇到此问题的所有人都应该继承默认的
DateFormatter
并重写其
parse
方法(如果需要,也可以重写其
print
方法),以添加一个类似于文档中所示的保护条款。请保留HTML标签。
package com.example.util;
import java.text.ParseException;
import java.util.Date;
import java.util.Locale;
public class DateFormatter extends org.springframework.format.datetime.DateFormatter {
@Override
public Date parse(String text, Locale locale) throws ParseException {
if (text != null && text.isEmpty()) {
return null;
}
return super.parse(text, locale);
}
}
接下来,必须对XML Spring配置进行一些修改:必须定义一个转换服务bean,并且必须正确设置命名空间中元素中的相应属性。
<mvc:annotation-driven conversion-service="conversionService" />
<beans:bean
id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<beans:property name="formatters">
<beans:set>
<beans:bean class="com.example.util.DateFormatter" />
</beans:set>
</beans:property>
</beans:bean>
为了提供特定的日期格式,必须正确设置DateFormatter bean的pattern属性。
<beans:bean class="com.example.util.DateFormatter">
<beans:property name="pattern" value="yyyy-MM-dd" />
</beans:bean>