2016-08-26 9 views
4

私は多くの豆を持っており、すべてLocalDateとLocalDateTimeを使用しています。 WicketのDateTextFieldと他のすべてのウィジェット(DatePickerなど)は、java.util.Dateでのみ動作します。何か方法はありますかをWicket 7に変換してLocalDateまたはLocalDateTimeを使用するようにしますか?Wicket 7をJava 8のjava.timeで使用するにはどうすればよいですか?

豆は次のようになります。

public class SomeBean { 
    Long id = null; 
    LocalDate since = null; 
    // plus getters and setters 
} 

A Wicketのフォームが現在CompoundPropertyModel

CompoundPropertyModel<SomeBean> model = new CompundPropertyModel<>(bean); 

答えて

3

を使用していますあなたは、例えば、IModel<java.util.Date>であなたのLocalDateとなどのモデルをラップすることができます

public static class LocalDateModel implements IModel<java.util.Date> { 
    private IModel<LocalDate> localDateModel; 
    public LocalDateModel(IModel<LocalDate> localDateModel){ 
     this.localDateModel = localDateModel; 
    } 


    @Override 
    public Date getObject() { 
     return convertLocalDateToUtilDateSomehow(localDateModel.getObject()); 
    } 

    @Override 
    public void setObject(Date object) { 
     localDateModel.setObject(convertUtilDateToLocalDateSomehow(object)); 
    } 

    @Override 
    public void detach() { 
     localDateModel.detach(); 
    } 
} 

このようなモデルをフォームコンポーネントにフィードすると、使用するフォームコンポーネントはうまく動作します。

CompoundPropertyModelに自動的にそのようなラッピングモデルを提供する場合は、ラップモデルを拡張し、ラップモデルが必要であると推測する方法をオーバーライドする必要があります(CompoundPropertyModel#wrapOnInheritance(Component component))。

LocalDateModelButAlsoWrappingは当然上記 LocalDateModel例の拡張子だけでなく、 IWrapModel<T>を実装する
@Override 
public <C> IWrapModel<C> wrapOnInheritance(Component component) 
{ 
    IWrapModel<C> actualModel = super.wrapOnInheritance(component); 
    if (actualModel.getObject() instanceOf LocalDate) { 
     return new LocalDateModelButAlsoWrapping(actualModel); 
    } else { 
     return actualModel; 
    } 
} 

ような何か。

あなたの代わりにあなたの通常のCompoundPropertyModelのこの拡張機能を使用する場合は、フィールドがLocalDateされたときに検出し、java.util.Dateモデルのように見えるようにラップされている(あなたのDateTextFieldなど)のコンポーネントにモデルを提供します。

私が与えたコードスニペットは、一般的な仕組みを説明するために提供しているだけなので、モデルオブジェクトを取得しない方がいいでしょう。したがって、推論する方法を工夫することをお勧めします。期待されるオブジェクトのタイプ(例えば、Componentの引数がDateTextFieldであるかどうかを確認できます)が、これは私が想像することができる解決策の一般的な方向です。

+0

は、あなたが正確な実装を提供することができ、してください?私はあなたのヒントに従うことはできません[この質問](http://stackoverflow.com/questions/42804070/java-time-localdate-and-wicket-7-datetextfield) – JimHawkins

0

あなたがあなた自身のコンバーター登録することができます。

https://ci.apache.org/projects/wicket/guide/7.x/guide/forms2.html#forms2_3

@Override 
protected IConverterLocator newConverterLocator() { 
    ConverterLocator defaultLocator = new ConverterLocator(); 

    defaultLocator.set(Pattern.class, new RegExpPatternConverter()); 

    return defaultLocator; 
} 

関連:https://issues.apache.org/jira/browse/WICKET-6200

+0

これは正しいです...DateTextField、DatePickerなどのようなWicketウィジェットを使用するという私の要求を解決するものではありません。 –

+1

DateTextFieldと同様にWiseTreeのモデルラッパーが正しい答えです。 – svenmeier

0

あなたは単にあなたが、これらは、このコミットに添付見つけるウィケット8からコンバータクラスをバックポートすることができますが:https://issues.apache.org/jira/browse/WICKET-6200(AbstractJavaTimeConverter、LocalDate、LocalDateTime、LocalTimeなどに必要なサブクラス)

もちろん、DateTextFieldには日付型パラメータがハードコードされているため、これは役に立ちません。以下に示すようなのために、あなたは、上記のコンバータを使用して、独自のサブクラスを作成したり、定期的なラベルとTextFieldを使用し、グローバルに登録コンバータとすることができ、次のいずれか

@Override 
protected IConverterLocator newConverterLocator() { 
    ConverterLocator converterLocator = new ConverterLocator(); 
    converterLocator.set(LocalDateTime.class, new LocalDateTimeConverter()); 
    converterLocator.set(LocalDate.class, new LocalDateConverter()); 
    converterLocator.set(LocalTime.class, new LocalDateConverter()); 
    return converterLocator; 
} 
関連する問題