具有SQL日期

时间:2017-11-12 16:39:30

标签: java spring-boot spring-data-jpa vaadin sql-date-functions

所以,我的POJO类中有一个属性SQL.Date。我想使用Vaadin Component中的Binder绑定它,但总是这样返回:

Property type 'java.sql.Date' doesn't match the field type 'java.time.LocalDate'. Binding should be configured manually using converter.

所以这里是我在POJO课程中包含的Getter Setter

public Date getDateOfBirth() {
    return dateOfBirth;
}

public void setDateOfBirth(Date dateOfBirth) { this.dateOfBirth = dateOfBirth; }

在我使用Binder组件的时候:

binder = new Binder<>(Person.class);
binder.bindInstanceFields( this );

仅供参考,我使用Spring Boot JPA作为数据。错误消息和Spring Boot的使用之间是否有任何关系?

2 个答案:

答案 0 :(得分:1)

  

属性类型&#39; java.sql.Date&#39;与字段类型不匹配   &#39; java.time.LocalDate&#39 ;.应使用手动配置绑定   转换器。

告诉我该怎么做。在没有看到您的代码的情况下,我假设您在某些Vaadin DateField中有Vaadin FormLayout,而您正试图填充java.sql.Date值(或binder.bindInstanceFields()次尝试)。

不幸的是DateField似乎只接受LocalDate。因此,您需要以某种方式转换该值。

有许多不同的&#34; date&#34; vaadin Converter类型层次结构中的转换器,但是这个转换器丢失了(或者我错过了它?)所以我创建了它:

public class SqlDateToLocalDateConverter
       implements Converter<LocalDate,java.sql.Date> {
    @Override
    public Result<java.sql.Date> convertToModel(LocalDate value,
           ValueContext context) {
        if (value == null) {
            return Result.ok(null);
        }
        return Result.ok( java.sql.Date.valueOf( value) );
    }
    @Override
    public LocalDate convertToPresentation(java.sql.Date value,
           ValueContext context) {
        return value.toLocalDate();
    }
}

您似乎在使用声明性ui?我现在无法告诉它如何轻而易举地解决这个问题。

如果您手动绑定字段,它将如下所示:

    binder.forField(myForm.getMyDateField())
       .withConverter(new SqlDateToLocalDateConverter())
       .bind(MyBean::getSqlDate, MyBean::setSqlDate);

所以我想你需要找到一种方法来添加这个转换器来处理假定的DateField。无论如何消息表明您可能无法使用简单方法binder.bindInstanceFields()但手动绑定字段。

答案 1 :(得分:0)

您可以创建自定义日期字段并使用它而不是DateField。然后,每次使用自动绑定时都不需要绑定它

public class CustomDateField extends CustomField<Date> {
    DateField dateField;

    public CustomDateField(String caption) {
        setCaption(caption);
        dateField = new DateField();
        dateField.setDateFormat("dd/MM/yy");
    }

    @Override
    protected Component initContent() {
        return dateField;
    }

    @Override
    protected void doSetValue(Date date) {
        dateField.setValue(date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate());
    }

    @Override
    public Date getValue() {
        return dateField.getValue() != null ? Date.from(dateField.getValue().atStartOfDay(ZoneId.systemDefault()).toInstant()) : null;
    }
}