Java8 、 Wicket 7 で開発していたら、Page 生成で
以下のように、java.time.LocalDate を DateTimeFormatter でフォーマット化して表示しようとすると、
error delegating to writeObject : java.time.format.DateTimeFormatter
org.apache.wicket.WicketRuntimeException: A problem occurred while trying to collect debug information about not serializable object
at org.apache.wicket.serialize.java.JavaSerializer$SerializationCheckerObjectOutputStream.writeObjectOverride(JavaSerializer.java:282) ~[wicket-core-7.1.0.jar:7.1.0]
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:344) ~[na:1.8.0_65]
at org.apache.wicket.serialize.java.JavaSerializer.serialize(JavaSerializer.java:78) ~[wicket-core-7.1.0.jar:7.1.0]
at org.apache.wicket.pageStore.AbstractPageStore.serializePage(AbstractPageStore.java:133) [wicket-core-7.1.0.jar:7.1.0]
at org.apache.wicket.pageStore.DefaultPageStore.createSerializedPage(DefaultPageStore.java:281) [wicket-core-7.1.0.jar:7.1.0]
at org.apache.wicket.pageStore.DefaultPageStore.storePage(DefaultPageStore.java:61) [wicket-core-7.1.0.jar:7.1.0]
at org.apache.wicket.page.PageStoreManager$PersistentRequestAdapter.storeTouchedPages(PageStoreManager.java:403) [wicket-core-7.1.0.jar:7.1.0]
at org.apache.wicket.page.RequestAdapter.commitRequest(RequestAdapter.java:193) [wicket-core-7.1.0.jar:7.1.0]
at org.apache.wicket.page.AbstractPageManager.commitRequest(AbstractPageManager.java:76) [wicket-core-7.1.0.jar:7.1.0]
at org.apache.wicket.page.PageManagerDecorator.commitRequest(PageManagerDecorator.java:74) [wicket-core-7.1.0.jar:7.1.0]
at org.apache.wicket.page.PageAccessSynchronizer$2.commitRequest(PageAccessSynchronizer.java:270) [wicket-core-7.1.0.jar:7.1.0]
これは、以下のように書くと起きてしまう。
final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
queue(new ListView<Element>("listview", new PropertyModel<List<Element>>(this, "list")){
@Override
protected void populateItem(ListItem<DeviceElement> item){
Element e = item.getModelObject();
item.add(new Label("create_date", e.create_date.format(dateTimeFormatter) ));
}
});
DateTimeFormatter のインスタンス生成を populateItem の繰り返し処理で実行させるのが気持ち悪くて
こう書いてしまった。
回避作は、、
final での DateTimeFormatter宣言を廃止して、
item.add(new Label("create_date", e.create_date.format(DateTimeFormatter.ofPattern("yyyy/MM/dd")) ));
にすることだった。