StatelessChecker を使う。

Serializable And Throwable Consumer - Oboe吹きプログラマの黙示録
を書いたので、忘れないように本当にステートレス Page として作ったのかチェックするのに
有効な方法を書いておく。

Page クラスに、StatelessComponent アノテーションを付与して WebApplation の init() で
StatelessChecker を beforeペーレンダリングリスナに登録しておく。

@StatelessComponent
public class HomePage extends WebPage{
    //  省略
}

WebApplation の init() で

public class SampleApplication extends WebApplication{
     @Override
    protected void init(){
          getComponentPostOnBeforeRenderListeners().add(new StatelessChecker());
   }

こうしておくとページを描画前に以下のとおり、ページの配置したどの?コンポーネントの組み込みが
ステートレスになっていなかったかを、例外で教えてくれる。

org.apache.wicket.devutils.stateless.StatelessCheckFailureException: 
'[Page class = org.sample.page.HomePage, id = 9, render count = 1]' 
claims to be stateless but isn't. Offending component: [Button [Component id = submit]]
   at org.apache.wicket.devutils.stateless.StatelessChecker.onBeforeRender(StatelessChecker.java:133)
   at org.apache.wicket.application.ComponentOnBeforeRenderListenerCollection$1.notify(ComponentOnBeforeRenderListenerCollection.java:40)
   at org.apache.wicket.application.ComponentOnBeforeRenderListenerCollection$1.notify(ComponentOnBeforeRenderListenerCollection.java:36)
   at org.apache.wicket.util.listener.ListenerCollection.notify(ListenerCollection.java:80)
   at org.apache.wicket.application.ComponentOnBeforeRenderListenerCollection.onBeforeRender(ComponentOnBeforeRenderListenerCollection.java:35)
   at org.apache.wicket.Component.internalBeforeRender(Component.java:949)
   at org.apache.wicket.Component.beforeRender(Component.java:1016)
   at org.apache.wicket.Component.internalPrepareForRender(Component.java:2231)
   at org.apache.wicket.Page.internalPrepareForRender(Page.java:239)
   at org.apache.wicket.Component.render(Component.java:2320)
   at org.apache.wicket.Page.renderPage(Page.java:987)
   at org.apache.wicket.request.handler.render.WebPageRenderer.renderPage(WebPageRenderer.java:124)
   at org.apache.wicket.request.handler.render.WebPageRenderer.respond(WebPageRenderer.java:236)
   at org.apache.wicket.core.request.handler.RenderPageRequestHandler.respond(RenderPageRequestHandler.java:202)
   at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:912)
   at org.apache.wicket.request.RequestHandlerExecutor.execute(RequestHandlerExecutor.java:65)
   at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:283)
   at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:253)
   at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:221)
   at org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:262)
   at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:204)
   at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:286)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
   at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
   at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:94)
   at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
   at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
   at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
   at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
   at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
   at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502)
   at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1132)
   at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
   at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1533)
   at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1489)
   at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
   at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
   at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
   at java.base/java.lang.Thread.run(Thread.java:844)