@newbiebad

Как в контроллере Spring boot настроить конвертирование строки unix timestamp в объект Date?

Имеется контроллер:
@RequestMapping(value = "/add/**", method = RequestMethod.POST)
public @ResponseBody Response<Post> addPost(PostDTO postDTO) {
    ...
}
и DTO:
public class PostDTO {
    private Date date;
    ...
}
При попытке передачи через POST параметра date=1456154872983, получаю следующую ошибку:
Could not parse date: Unparseable date: \"1456154872983\"","objectName":"postDTO","field":"date"
Я понял как настроить преобразование кастомного формата через InitBinder, с ним всё получилось, но никак не найду как работать с обычным unix timestamp.
Версия spring boot: 1.3.1.RELEASE
  • Вопрос задан
  • 442 просмотра
Решения вопроса 1
@newbiebad Автор вопроса
Разобрался. Достаточно переопределить класс PropertyEditorSupport и зарегистрировать его. В методе setAsText, куда поступает строка с датой, уже можно обрабатывать как угодно.

Выкладываю решение, на случай, если кому-то понадобится.

В контроллере необходимо добавить метод, в котором регистрируется editor:
@InitBinder
public final void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(Date.class, new UnixTimestampDateEditor(true));
}

Класс editor'а, который обрабатывает unix timestamp(основательно не тестировался, но общая идея ясна):
import org.springframework.util.StringUtils;
import java.beans.PropertyEditorSupport;
import java.util.Date;

public class UnixTimestampDateEditor extends PropertyEditorSupport {

    private boolean allowEmpty;

    public UnixTimestampDateEditor(boolean allowEmpty) {
        this.allowEmpty = allowEmpty;
    }

    public UnixTimestampDateEditor(boolean allowEmpty, Object source) {
        super(source);
        this.allowEmpty = allowEmpty;
    }
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        try {
            if (this.allowEmpty && !StringUtils.hasText(text)) {
                setValue(null);
            } else {
                long unixTimestamp = Long.parseLong(text);

                if (unixTimestamp < 0) {
                    throw new IllegalArgumentException("argument < 0 ");
                }

                Date date = new Date(unixTimestamp * 1000);

                setValue(date);
            }
        } catch (NumberFormatException pe) {
            throw new IllegalArgumentException("Could not parse date: " + pe.getMessage(), pe);
        }
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
unitby
@unitby
гденить по дороге заюзать:
java.util.Date((long)timeStamp*1000)

в яве дата в миллисеках
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы