Wicket の WebPage でファイルダウンロードさせる1つの方法である RequestCycle の scheduleRequestHandlerAfterCurrent を使用する時、
そのまま以下のようなことを書いていた。。
getRequestCycle().scheduleRequestHandlerAfterCurrent(new ResourceStreamRequestHandler(new AbstractResourceStreamWriter(){ @Override public void write(OutputStream out){ // OutputStream に出力 out.flush(); out.close(); } @Override public String getContentType(){ // 返す ContentType を指定 return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; } }, "filename"));
でも、これは AbstractResourceStreamWriter の close() が約束されてないことになり Eclipse では
潜在的なリソース・リーク: '
になる
AbstractResourceStreamWriter のインターフェースである IResourceStreamWriter は、IResourceStream の継承で
Closeable であるので、try(){ ~ } 構文にすべきだ。
try(IResourceStreamWriter writer = new AbstractResourceStreamWriter(){ @Override public void write(OutputStream out) throws IOException{ // OutputStream に出力する。 out.flush(); out.close(); } @Override public String getContentType() { // 返す ContentType を指定 return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; } }){ getRequestCycle().scheduleRequestHandlerAfterCurrent( new ResourceStreamRequestHandler(writer, URLEncoder.encode("サンプル.xlsx", "UTF-8") )); }catch(Exception e){ // エラー捕捉 }