2014-01-13 42 views
4

我想从运行Struts2,Hibernate和Spring的web服务器上下载文件,但我总是得到这个异常。在struts 2中下载文件

java.lang.IllegalArgumentException: Can not find a java.io.InputStream with the name [inputName] in the invocation stack. Check the <param name="inputName"> tag specified for this action. 
    org.apache.struts2.dispatcher.StreamResult.doExecute(StreamResult.java:237) 
    org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186) 
    com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:371) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:275) 
    org.apache.struts2.interceptor.DeprecationInterceptor.intercept(DeprecationInterceptor.java:41) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:167) 
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265) 
    org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68) 
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:249) 
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:249) 
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:191) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:73) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:91) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:252) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171) 
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:139) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:193) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:189) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.riteshsangwan.ossoc.core.interceptors.AuthenticationInterceptor.intercept(AuthenticationInterceptor.java:34) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54) 
    org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:562) 
    org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) 
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99) 

我检查了inputName参数并调试了项目,找出InputStream不为null。

这是下载类

inputName= new ByteArrayInputStream(mf.getFileContent()); 

,这是Struts 2的映射

 <action name="downloadfile" class="com.riteshsangwan.ossoc.core.actions.DownloadFile"> 
      <result name="success" type="stream"> 

       <param name="inputName">inputName</param> 
       <param name="contentDisposition">attachment;filename=${fileName}</param> 
       <param name="contentType">${contentType}</param> 
       <param name="bufferSize">1024</param> 
       <param name="contentLength">${contentLength}</param> 
       <param name="allowCaching">false</param> 

      </result> 
      <result name="input">/user/files.jsp</result> 
     </action> 

是因为ByteArrayInputStream的或任何其他原因的除外。我有所有变量的公共getter和setter方法,并且我检查了它们都不是null。

EDITS:DownloadFile类

package com.riteshsangwan.ossoc.core.actions; 

import com.opensymphony.xwork2.ActionContext; 
import com.opensymphony.xwork2.ActionSupport; 
import com.riteshsangwan.ossoc.core.dao.FilesBo; 
import com.riteshsangwan.ossoc.core.entities.Files; 
import com.riteshsangwan.ossoc.core.entities.Users; 
import com.riteshsangwan.ossoc.core.util.MyFile; 
import com.riteshsangwan.ossoc.core.util.Operations; 
import java.io.ByteArrayInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.List; 
import java.util.Map; 
import javax.servlet.ServletContext; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.context.ServletContextAware; 


public class DownloadFile extends ActionSupport implements ServletContextAware{ 

    private long fid; 
    private String contentType; 
    private long contentLength; 
    private String fileName; 
    private InputStream inputName; 


    private ServletContext context; 
    private String downloadStatus; 
    private String downloadpassword; 
    private List fileList; 
    private Map<String,Object> session; 

    public String getFileName() { 
     return fileName; 
    } 

    public void setFileName(String fileName) { 
     this.fileName = fileName; 
    } 


    public List getFileList() { 
     return fileList; 
    } 

    public void setFileList(List fileList) { 
     this.fileList = fileList; 
    } 


    public String getDownloadStatus() { 
     return downloadStatus; 
    } 

    public void setDownloadStatus(String downloadStatus) { 
     this.downloadStatus = downloadStatus; 
    } 

    public String getDownloadpassword() { 
     return downloadpassword; 
    } 

    public void setDownloadpassword(String downloadpassword) { 
     this.downloadpassword = downloadpassword; 
    } 

    public String getStatus() { 
     return downloadStatus; 
    } 

    public void setStatus(String downloadStatus) { 
     this.downloadStatus = downloadStatus; 
    } 

    @Autowired 
    private FilesBo fbo; 

    @Autowired 
    private Operations operation; 

    public Operations getOperation() { 
     return operation; 
    } 

    public void setOperation(Operations operation) { 
     this.operation = operation; 
    } 

    public FilesBo getFbo() { 
     return fbo; 
    } 

    public void setFbo(FilesBo fbo) { 
     this.fbo = fbo; 
    } 


    public long getFid() { 
     return fid; 
    } 

    public void setFid(long fid) { 
     this.fid = fid; 
    } 

    public String getContentType() { 
     return contentType; 
    } 

    public void setContentType(String contentType) { 
     this.contentType = contentType; 
    } 

    public long getContentLength() { 
     return contentLength; 
    } 

    public void setContentLength(long contentLength) { 
     this.contentLength = contentLength; 
    } 


    public InputStream getInputName() { 
     return inputName; 
    } 

    public void setInputName(InputStream inputName) { 
     this.inputName = inputName; 
    } 


    @Override 
    public String execute(){ 
     String response; 
     int a=10; 
     try 
     { 
      session=ActionContext.getContext().getSession(); 
      Users u= (Users) session.get("user"); 
      long uid=u.getUid(); 
      fileList=fbo.getAllFiles(uid); 
      Files f=getFbo().getFileWithData(getFid()); 
      MyFile mf=new MyFile(); 
      mf.setFileContent(f.getFileData()); 
      mf.setFileContentType(f.getFileContentType()); 
      mf.setFileHash(f.getFileHash()); 
      mf.setFileName(f.getFileName()); 
      mf.setFileSize(f.getFileSize()); 
      mf.setPassword(downloadpassword); 
      mf=operation.decrypt(mf); 

      fileName=mf.getFileName(); 
      contentLength=mf.getFileSize(); 
      contentType=mf.getFileContentType(); 

      inputName=new ByteArrayInputStream(mf.getFileContent()); 

      response=ActionSupport.SUCCESS; 
     } 
     catch(IOException e) 
     { 
      if(e.getMessage().equalsIgnoreCase("Message has been altered or password incorrect")) 
      { 
       downloadStatus="Message has been altered or incorrect password. Try again."; 
      } 
      response=ActionSupport.INPUT; 
     } 
     catch(Exception e) 
     { 
      downloadStatus="Some error occured. Try Again"; 
      response=ActionSupport.INPUT; 
     } 
     return response; 
    } 

    @Override 
    public void setServletContext(ServletContext servletContext) { 
     this.context=servletContext; 
    } 

} 
+0

显示你的'DownloadFile'行动。 –

+0

@AleksandrM请参阅EDITS – user123

+0

@ user3172529您的'inputName'参数不是'InputStream'类型。检查上下文中的值。 –

回答

2

好吧,改变inputNameinputStream。像这样

private InputStream inputStream; 

public InputStream getInputStream() { 
    return inputStream; 
} 

public void setInputStream(InputStream inputStream) { 
    this.inputStream= inputStream; 
} 

的参数inputName默认设置为inputStream,那么,你可能会删除它。另请注意,结果中的参数名称将在值栈中查找。因此,如果您在操作中公开了像getInputName这样的获取方式,则意味着您要覆盖配置中的值。

+0

你可以看看 http://stackoverflow.com/questions/21076569/jsp-value-of - 变化后改变模型弹出 我不明白为什么价值改变后模式弹出即使他们在同一页 – user123

0

确保getInputName()方法不返回null,如果它返回null,则会发生此异常。

这个异常的描述是误导性的,它会让你觉得你的inputName参数配置的名称是错误的。但是,实际的原因是getInputName()的返回InputStream为null。

0

  <param name="inputName">inputName</param> 
      <param name="contentDisposition">attachment;filename=${fileName}</param> 
      <param name="contentType">${contentType}</param> 
      <param name="bufferSize">1024</param> 
      <param name="contentLength">${contentLength}</param> 
      <param name="allowCaching">false</param> 


      *<!--add a iuputStream--> 
      <param name="inputStream">inputName</param>* 

     </result> 
     <result name="input">/user/files.jsp</result> 
    </action> 
+1

请解释你的答案有点? – Ray