Wicket の RequestCycle の scheduleRequestHandlerAfterCurrent で IRequestHandler を指定して
応答としてファイル出力する方法は標準として昔から存在した。
以下のように WebPage で書いていたものだ。
@Inject Logic logic; getRequestCycle().scheduleRequestHandlerAfterCurrent(new IRequestHandler(){ @Override public void respond(IRequestCycle cycle){ try(OutputStream out = cycle.getResponse().getOutputStream()){ logic.printFile(out); out.flush(); }catch(Exception e){ throw new RuntimeException(e); } } } );
すでに Wicket 8 では、IRequestHandler も @FunctionalInterface が付いており、1つのメソッドと
default メソッド1つしかないので、、
getRequestCycle().scheduleRequestHandlerAfterCurrent(cycle->{ try(OutputStream out = cycle.getResponse().getOutputStream()){ logic.printFile(out); out.flush(); }catch(Exception e){ throw new RuntimeException(e); } });
で書ける。
応答としてファイル出力するメソッドが内部で例外捕捉するようにすれば、
例えば、メソッド名=printFileNoexception と適当に銘打って、、
getRequestCycle().scheduleRequestHandlerAfterCurrent( c->logic.printFileNoexception(c.getResponse().getOutputStream()) );
完全ではないがほぼ、普遍的なコード1行で書けるようになる。