【问题标题】:How to bind a Vaadin DateField to a LocalDateTime如何将 Vaadin DateField 绑定到 LocalDateTime
【发布时间】:2016-09-11 05:05:39
【问题描述】:

Vaadin docs 展示了如何将DateFieldjava.util.Date 一起使用,但我想将DateFieldBeanFieldGroup 绑定到Java 8 类型java.time.LocalDateTime 的bean 属性。我怎样才能做到这一点?

【问题讨论】:

    标签: vaadin vaadin7 jsr310


    【解决方案1】:

    似乎Vaadin Converter 是要走的路:

    package org.raubvogel.fooddiary.util;
    
    import java.time.LocalDateTime;
    import java.time.ZoneOffset;
    import java.util.Date;
    import java.util.Locale;
    
    import com.vaadin.data.util.converter.Converter;
    
    /**
     * Provides a conversion between old {@link Date} and new {@link LocalDateTime} API.
     */
    public class LocalDateTimeToDateConverter implements Converter<Date, LocalDateTime> {
    
        private static final long serialVersionUID = 1L;
    
        @Override
        public LocalDateTime convertToModel(Date value, Class<? extends LocalDateTime> targetType, Locale locale)
                throws com.vaadin.data.util.converter.Converter.ConversionException {
    
            if (value != null) {
                return value.toInstant().atZone(ZoneOffset.systemDefault()).toLocalDateTime();
            }
    
            return null;
        }
    
        @Override
        public Date convertToPresentation(LocalDateTime value, Class<? extends Date> targetType, Locale locale)
                throws com.vaadin.data.util.converter.Converter.ConversionException {
    
            if (value != null) {
                return Date.from(value.atZone(ZoneOffset.systemDefault()).toInstant());
            }
    
            return null;
        }
    
        @Override
        public Class<LocalDateTime> getModelType() {
            return LocalDateTime.class;
        }
    
        @Override
        public Class<Date> getPresentationType() {
            return Date.class;
        }
    
    }
    

    灵感来自this link,它在LocalDateDate 之间转换。转换器需要通过setConverterconverter factory 设置为DateField

    【讨论】:

    • 仅供参考:转换器现在是 Vaadin 8 中 Binder 的一部分,并且其界面已更改。 Vaadin 8 现在带有 LocalDateLocalDateTime 的转换器,日期字段本身现在依赖于新的日期类型。
    【解决方案2】:

    这将是一个从 LocalDate 到 LocalDateTime 的 Vaadin 8 转换器:

    package de.company.project.portal.application.views.documents;
    
    import com.vaadin.data.Converter;
    import com.vaadin.data.Result;
    import com.vaadin.data.ValueContext;
    
    import java.time.LocalDate;
    import java.time.LocalDateTime;
    import java.time.ZoneId;
    import java.util.Objects;
    
    /**
     * A converter that converts between <code>LocalDate</code> and
     * <code>LocalDateTime</code>.
     *
     * Created from Vaadin v.8.13.0 LocalDateTimeToDateConverter
     */
    public class LocalDateToLocalDateTimeConverter
            implements Converter<LocalDate, LocalDateTime>
    {
        private ZoneId zoneId;
    
        /**
         * Creates a new converter using the given time zone.
         *
         * @param zoneId
         *            the time zone to use, not <code>null</code>
         */
        public LocalDateToLocalDateTimeConverter(ZoneId zoneId) {
            this.zoneId = Objects.requireNonNull(zoneId,
                    "Zone identifier cannot be null");
        }
    
    
        @Override
        /** @return LocalDateTime from LocalDate with atTime(0,0,0,0) */
        public Result<LocalDateTime> convertToModel(LocalDate localDate,
                                                    ValueContext context)
        {
            if (localDate == null) {
                return Result.ok(null);
            }
            return Result.ok(LocalDateTime.from(localDate.atTime(0,0,0,0))); //(hrs, mins, sec, nano sec)
        }
    
    
        @Override
        public LocalDate convertToPresentation(LocalDateTime localDateTime,
                                               ValueContext context)
        {
            if (localDateTime == null) {
                return null;
            }
            return LocalDate.from(localDateTime.atZone(zoneId));
        }
    
    }
    

    在 Binder 中与 DTO DocumentDto 一起使用:

    public void bindCreationDate(DateField field) {
        forField(field.getField())
                .withConverter(new LocalDateToLocalDateTimeConverter(ZoneId.systemDefault()))
                .bind(DocumentDto::getCreationDate, DocumentDto::setCreationDate);
    }
    

    【讨论】:

      猜你喜欢
      • 2019-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多