2017-11-12 14 views
1

したがって、私はPOJOクラスにプロパティSQL.Dateを持っています。私はVaadin Componentからバインダーを使用して、それをバインドしたいのですが、いつものように返さ:だからここSQLを持つDateField Vaadinコンポーネント日付

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

をPOJOクラス

public Date getDateOfBirth() { 
    return dateOfBirth; 
} 

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

をに含まれている私のゲッターセッターだと私は、バインダー成分を使用したときに、ここです:

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

参考までに、私はSpring Boot JPAをデータとして使用しています。エラーメッセージとSpring Bootの使用法には関係がありますか?

+0

どのバージョンですか? Vaadin8? – pirho

+0

はい、Vaadin 8.0.0 –

+0

完全なスタックトレースを提供しないと、どのlibがそのスタックを引き起こしているのかを知ることは難しいです。 –

答えて

1

この

不動産の種類 'java.sql.Dateは' フィールドタイプ 'java.time.LocalDate' と一致しません。バインディングは コンバータを使用して手動で設定する必要があります。

は何をするかを指示します。あなたのコードを見ることなく、私はあなたが値(またはbinder.bindInstanceFields()が試行)を入力しようとしているVaadin FormLayoutに、Vaadin DateFieldがあると仮定します。

残念ながらDateFieldLocalDateしか受け入れられないようです。したがって、何らかの形で値を変換する必要があります。

ありConverter型階層をvaadinの異なる「日付」のコンバータの多くがありますが、この一つが欠けている(または多分私はそれを逃した?)ので、私はそれを作成しました:

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(); 
    } 
} 

あなたが、宣言を使用しているようですウイ?私は今、それを少しでも努力して移植する方法を伝えることができません。

あなたがフィールドを結合していた場合、手動ではこのように行くだろう:

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

だから私はあなたがDateFieldを仮定を処理するために、このコンバータを追加する方法を見つける必要があると思いますが。とにかく、簡単な方法binder.bindInstanceFields()ではなく、フィールドを手動でバインドすることができない可能性があります。

+0

ああああ。説明のおかげで、コンバータのソースコードのおかげです。本当にありがとう –

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; 
    } 
} 
+0

woow。私はVaadinでカスタムクラスを作成できることに気付きました。答えてくれてありがとう。 –

関連する問題