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

Wicket scheduleRequestHandlerAfterCurrent 使用の書き方を見直す

Wicket

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 では
潜在的なリソース・リーク: '' may not be closed
になる

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){
   // エラー捕捉
}