Более поздние версии среды Spring представили сервисы преобразования и форматирования для решения этих задач, что каким-то образом оставило позади систему редакторов свойств. Однако проблема, о которой сообщают, к сожалению, все еще присутствует: по умолчанию DateFormatter
не может правильно преобразовать пустую строку в объект null
Date
. Что меня очень раздражает, так это то, что документация Spring содержит пример фрагмента форматирования даты, где для обоих преобразований (в и из строк) реализованы соответствующие защитные предложения . Это несоответствие между реализацией фреймворка и документацией фреймворка действительно сводит меня с ума, настолько, что я даже могу попытаться представить патч, как только найду время, чтобы посвятить себя задаче.
В то же время, я предлагаю всем, кто сталкивается с этой проблемой при использовании современной версии Spring Framework, подкласс по умолчанию DateFormatter
и переопределить его parse
метод (его метод print
тоже, если это необходимо) ), чтобы добавить пункт об охране в порядке, аналогичном приведенному в документации.
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-компонент службы преобразования и должен быть правильно установлен соответствующий атрибут в элементе annotation-driven
в пространстве имен mvc
.
<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>
Чтобы указать конкретный формат даты, свойство pattern
компонента DateFormatter
должно быть правильно установлено.
<beans:bean class="com.example.util.DateFormatter">
<beans:property name="pattern" value="yyyy-MM-dd" />
</beans:bean>