1

OK、これがページのコードです

public class ViewDocument extends BasePage{

    private List<WeinSyncFileContent> transactions;
    ....

    public ViewDocument(){
        transactions = ....;
        ....
        listContainer.add(listView = new ListView<WeinSyncFileContent>("transactions", transactions){
           @Override
           public void populateItem(final ListItem<WeinSyncFileContent> item)
           {
              ....
           }
        });
    }
}

ページは表示されますが、エラーが発生します: オブジェクト クラス kz.wein.wicket.pages.documents.ViewDocument のシリアル化中にエラーが発生しました

そして、トランザクションフィールドについて不平を言っています: transactions [class=java.util.ArrayList$SubList] <----- field that is not serializable

また、リストに表示しているオブジェクトは最初にライブラリから取得され、シリアル化できないことに注意してください。Wicket はリスト内のシリアライズ可能なオブジェクトを必要とするので、それに対処するために、各オブジェクトを取得し、このようなクラスでシリアライズ可能にします

public class WeinSyncFileContent extends SyncFileContent implements Serializable{

public WeinSyncFileContent(SyncFileContent obj){
    ... setting fields ...

}

}

そのため、最初に SyncFileContent オブジェクト (シリアライズ可能ではない) を取得します。エラーについて何ができますか?

4

1 に答える 1

4

Wicket ページのフィールド レベルの変数はシリアル化されるため、このエラーが発生します。そのため、シリアル化できないオブジェクトをフィールド レベル変数として使用しないことをお勧めします。WeinSyncFileContent にはシリアル化できないオブジェクトが必要です。これが、このエラーが発生する理由です。

代わりに、次のようなモデルを使用してリストをロードすることをお勧めします。

public ViewDocument(){

    ...

    listContainer.add(new ListView<WeinSyncFileContent>(
        "transactions", 
        new LoadableDetachableModel<List<WeinSyncFileContent>>() {
            protected List<WeinSyncFileContent> load() {
                return ...;
            }
        })
    {
       @Override
       public void populateItem(final ListItem<WeinSyncFileContent> item)
       {
          ....
       }
    });
}
于 2013-05-31T13:42:30.360 に答える