Весна. Как конвертировать свойство объекта с помощью PropertyEditors?

У меня есть страница JSP с формой Spring:

<form:form id="edit-form" method="POST" commandName="item"
                    action="items">
    <form:input id="title" path="title" type="text" />

    <form:textarea id="description" path="description"></form:textarea>

    <form:input id="timeLeft" type="text" path="timeLeft" />

    <button type="submit" id="sell-item">Create/Edit</button>

</form:form>

В формате временного интервала у клиента: ЧЧ: ММ, но на стороне сервера нам нужно преобразовать его в миллисекунды (длинные). Как это сделать (с клиента приходит объект Item с (поля title, description, timeleft))? Как конвертировать конкретное свойство в пользовательский объект?

Я пытаюсь сделать что-то подобное:

Класс контроллера с методом initBinder:

@InitBinder
private void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(String.class, "item.timeLeft",
            new TimeleftPropertyEditor());
}

@RequestMapping(method = RequestMethod.POST)
public void create(@ModelAttribute("item") Item item, BindingResult result) {
    System.out.println(item + ": " +result.getAllErrors());
}

TimeleftPropertyEditor:

public class TimeleftPropertyEditor extends PropertyEditorSupport {
private static final int MILLIS_IN_HOUR = 60 * 60 * 1000;
private static final int MILLIS_IN_MINUTE = 60 * 1000;

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        Long result = null;
        if (text != null) {
            String[] time = text.split(":");
            if (time.length != 1) {
                long hours = Long.parseLong(time[0]) * MILLIS_IN_HOUR;
                long minutes = Long.parseLong(time[1]) * MILLIS_IN_MINUTE;
                result = hours + minutes;
            } else {
                result = -1L;
            }
        }
        setValue(result);
    } 
}

Но метод setAsText не вызывается при поступлении запроса. У объекта BindingResult есть ошибки: [Ошибка поля в объекте 'item' в поле 'timeLeft': отклоненное значение [12:33]; коды [typeMismatch.item.timeLeft, typeMismatch.timeLeft, typeMismatch.java.lang.Long, typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [item.timeLeft, timeLeft]; аргументы []; сообщение по умолчанию [timeLeft]]; сообщение по умолчанию [Не удалось преобразовать значение свойства типа 'java.lang.String' в требуемый тип 'java.lang.Long' для свойства 'timeLeft'; вложенное исключение - java.lang.NumberFormatException: для входной строки: "12:33"]]

0 ответов

Другие вопросы по тегам