2014-07-11 25 views
1

的java.io.InputStream这类似的问题:的Struts 2 - HTTP状态500 - 无法找到名为

Question A

Question B

但我不能适用于解决方案我的情况。也许有人可以在我的代码中发现错误。

我想生成Excel文件在我的Struts2的应用程序,让用户下载,但我得到一个错误:

“HTTP状态500 - 无法找到与该名字的java.io.InputStream”

使用调试器我已经确认,正确的输入流与文件内容创建和方法返回'成功',所以似乎Struts没有拿起这个流。

struts.xml我:

<action name="exportReferences" class="manageRefAction" method="exportReferences"> 
     <result name="success" type="stream"> 
      <param name="contentType">application/vnd.ms-excel;charset=utf-8</param> 
      <param name="contentDisposition">contentDisposition</param> 
      <param name="inputName">excelStream</param> 
      <param name="bufferSize">1024</param> 
     </result> 
      (...) 
    </action> 

然后在ManageRefAction I类有:

private InputStream excelStream; 

    public InputStream getExcelStream() { 
     return this.excelStream; 
    } 

public String exportReferences() { 

     List<ReferenceData> referenceXLSList = null; 
     String exportFilename = null; 
     String filename = ""; 
     String retrunStr = process(); 

     Map session = (Map) ActionContext.getContext().get("session"); 

     if (retrunStr.equalsIgnoreCase(ActionSupport.LOGIN)) { 
      setLog("2"); 

      return LOGIN; 
     } else { 
      //Export only data with user's locale 
      ArrayList userLocale = (ArrayList) session.get("userLocale"); 
      List<ArrayList> list = Arrays.asList(userLocale); 
      try { 
       referenceXLSList = referenceDataService.fetchReferenceDataXls(); 
       // Data filtering 
       for (Iterator<ReferenceData> iterator = referenceXLSList.iterator(); iterator.hasNext();) { 
        ReferenceData ref = iterator.next(); 
        String l = ref.getLocal().toLowerCase(); 
        if (!userLocale.contains(l)) { 
         iterator.remove(); 
        } 
       } 
       if (referenceXLSList.isEmpty()) { 
        return INPUT; 
       } 
       ServletContext servletContext = ServletActionContext.getServletContext(); 
       String exportFolderPath = servletContext.getRealPath("/files" + "/xls"); 

       File folder = new File(exportFolderPath); 
       // Creation of the folder if it is not existing 
       if (!folder.exists()) 
        folder.mkdirs(); 

       exportFilename = PLConstants.REF_SHEET_NAME + PLConstants.XLS_FILE_EXTENSION; 
       filename = exportFolderPath + "/" + exportFilename; 
       File file = new File(filename); 
       file.createNewFile(); 
       ExcelWriter writer = new ExcelWriter(); 
       Workbook wb = writer.writeRefData(filename, exportFilename, referenceXLSList); 
       setContentDisposition("attachment; filename=" + exportFilename); 
       ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
       wb.write(baos); 
       this.excelStream = new ByteArrayInputStream(baos.toByteArray()); 
       return SUCCESS; 
      } catch (Throwable e) { 
       e.printStackTrace(); 
       logger.info("Exception while exporting partner references", e); 
       return INPUT; 
      } 
     } 

    } 
+0

你有'contentDisposition'吸气的exception.use? –

+0

我没有getter,但我设置了setContentDisposition(“attachment; filename =”+ exportFilename); – Michlis

+0

它应该可用于结果,所以你必须创建一个getter。 –

回答

1

试试这个,contentDisposition是struts.xml中没有得到的字符串值。 所以,它抛出这句法${contentDisposition}在参数

<action name="exportReferences" class="manageRefAction" method="exportReferences"> 
    <result name="success" type="stream"> 
     <param name="contentType">application/vnd.ms-excel;charset=utf-8</param> 
     <param name="contentDisposition">${contentDisposition}</param> 
     <param name="inputName">excelStream</param> 
     <param name="bufferSize">1024</param> 
    </result> 
     (...) 
    </action> 
+0

没有帮助... – Michlis

相关问题