読者です 読者をやめる 読者になる 読者になる

Wicket 7 で DateTimeFormatterがエラー

Wicket

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")) ));

にすることだった。