所以,我的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的使用之间是否有任何关系?
答案 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;
}
}