oc4j 10.1.3 で実行する Vaadin アプリケーションを開発しています。クエリの結果を csv ファイルとしてエクスポートできるウィンドウがあります。csv ファイルを vaadin FileResource として作成した後、ファイルを開くことができません。スニペットは次のとおりです。
File file = exporter.exportToFile();
final FileResource resource = new FileResource(file, getApplication());
resource.setCacheTime(0);
resource.getStream().setParameter("Content-Disposition", "attachment;filename=\""+file.getName()+"\"");
event.getButton().getWindow().open(resource);
この時点で、リソースの uri は次のようになります。app://APP/1/xy.csv
「/VAADIN」の「/」パスをリダイレクトするフィルタがあります。このフィルターが呼び出されると、ファイルの uri が/VAADIN/APP/1/xy.csv
ではなく に/APP/1/xy.csv
なるため、不要な /VAADIN 部分を削除requestdispatcher.forward
し、新しい uri で呼び出します。しかし、ここに楽しい部分があります。アプリケーションはまだ失敗します。ログには次のように書かれています。
Aug 13, 2012 1:55:58 PM com.vaadin.terminal.gwt.server.AbstractApplicationServlet serveStaticResourcesInVAADIN
INFO: Requested resource [VAADIN/APP/1/xy.csv] not found from filesystem or through class loader. Add widgetset and/or theme JAR to your classpath or add files to WebContent/VAADIN folder.
だから、ウリはまた間違っています。アドレス バーに表示され、アプリケーションはメイン ページにリセットされます。ただし、この uri がまだアドレス バーにある状態で、csv ファイルを再度作成しようとすると、アプリで他のクエリと同じことを行うと、エクスポート部分は以前に生成されたファイルを返します。別のクエリを再度実行しようとすると (以前の URL がブラウザのアドレス バーに残っている)、新しい csv ファイルが生成されたように見えますが、最初のファイルが返されます。
それは vaadin のバグですか、それとも oc4j マジックですか? :)