Преобразование пустой строки в нулевой объект Date с помощью Spring - PullRequest
30 голосов
/ 26 января 2011

У меня есть поле формы, которое должно быть преобразовано в объект Date, следующим образом:

<form:input path="date" />

Но я хочу получить нулевое значение, когда это поле пустое, вместо того, чтобы получить:1004 *

Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'date';
org.springframework.core.convert.ConversionFailedException: Unable to convert value "" from type 'java.lang.String' to type 'java.util.Date';

Есть ли простой способ указать, что пустые строки должны быть преобразованы в нуль?Или я должен написать свой PropertyEditor ?

Спасибо!

Ответы [ 2 ]

48 голосов
/ 26 января 2011

Spring предоставляет PropertyEditor с именем CustomDateEditor , который можно настроить для преобразования пустой строки в нулевое значение. Обычно вы должны зарегистрировать его в @InitBinder методе вашего контроллера:

@InitBinder
public void initBinder(WebDataBinder binder) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    dateFormat.setLenient(false);

    // true passed to CustomDateEditor constructor means convert empty String to null
    binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
}
6 голосов
/ 07 апреля 2015

Более поздние версии среды 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...