Ответы пользователя по тегу Java
  • Почему при использовании ControllerAdvice отличается поведение?

    @newbiebad Автор вопроса
    Часть проблемы была в отмеченом решении, а часть в том, что я не пометил метод-handler аннотацией @ResponseBody.
    Ответ написан
    1 комментарий
  • Как в контроллере Spring boot настроить конвертирование строки unix timestamp в объект Date?

    @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);
            }
        }
    }
    Ответ написан
    Комментировать