我们正在开发一个 Vaadin 应用程序,在 oc4j 10.1.3 上运行它。有一个窗口,可以将查询结果导出为 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又错了。它出现在地址栏中,应用程序重置到主页。但是,由于此 uri 仍在地址栏中,当我尝试再次创建 csv 文件时,在应用程序中执行与其他一些查询相同的操作时,导出部分确实会返回一个文件,即先前生成的文件。如果我尝试再次进行另一个查询(之前的 url 仍在浏览器的地址栏中),它似乎会生成新的 csv 文件,但会再次返回第一个文件。
它是一个 vaadin 错误还是一些 oc4j 魔法?:)