Весна. Как конвертировать свойство объекта с помощью 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"]]