PrimeFaces文件下载不起作用



我无法使primeFaces <p:filedownload工作。而我使用自定义下载bean成功地下载了该文件。这个问题似乎与下载ActionListener的primefaces文件有关,但我不知道是怎么回事。有人知道线索吗?谢谢

这是我的豆子:

@ManagedBean(name="fileDownloadBean")
@SessionScoped
public class FileDownloadBean implements Serializable {
    private StreamedContent file;
    public StreamedContent getFile() {
        return file;
    }
    public void setFile(StreamedContent file) {
        this.file = file;
    }
    /** Creates a new instance of FileDownloadBean */
    public FileDownloadBean() {
        InputStream stream = this.getClass().getResourceAsStream("sessionlog.csv");
        file = new DefaultStreamedContent(stream, "application/csv", "sessionlog.csv");
    }
}

这是我的视图代码:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:p="http://primefaces.prime.com.tr/ui" 
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:o="http://openfaces.org/"
                template="./../template.xhtml">
    <ui:define name="title">
        #{bundle.Log}
    </ui:define>
    <ui:define name="body">
        <h:form>
            <p:separator style="height: 10px;margin-bottom: 10px;margin-top: 0px;"/>
            <p:commandButton value="#{bundle.Log}" image="ui-icon ui-icon-link" ajax="false" disabled="false">
                <p:fileDownload value="#{fileDownloadBean.file}" />
            </p:commandButton>
</ui:composition>

我得到一个500错误:NullPointerException:

HTTP Status 500 -
type Exception report
message
descriptionThe server encountered an internal error () that prevented it from fulfilling this request.
exception
javax.servlet.ServletException
root cause
java.lang.NullPointerException
note The full stack traces of the exception and its root causes are available in the GlassFish Server Open Source Edition 3.1 logs.
GlassFish Server Open Source Edition 3.1

日志:

WARNING: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception
java.lang.NullPointerException
    at org.primefaces.component.filedownload.FileDownloadActionListener.processAction(FileDownloadActionListener.java:59)
    at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769)
    at javax.faces.component.UICommand.broadcast(UICommand.java:300)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:409)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1534)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:326)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:227)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:170)
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822)
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719)
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013)
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
    at java.lang.Thread.run(Thread.java:662)
InputStream stream = this.getClass().getResourceAsStream("sessionlog.csv");

根据您定位CSV文件的方式,希望它与当前类FileDownloadBean位于相同的包中。

如果它实际上位于包根目录中,那么您应该使用:

InputStream stream = this.getClass().getResourceAsStream("/sessionlog.csv");

或者,如果它实际上位于不同的包中,例如com.example,那么您应该使用:

InputStream stream = this.getClass().getResourceAsStream("/com/example/sessionlog.csv");

或者,如果它实际上位于公共网络内容的根目录中(在所有其他网络文件中,/WEB-INF文件夹也在那里),那么您应该使用:

InputStream stream = externalContext.getResourceAsStream("/sessionlog.csv");

(顺便说一句,它也适用于WAR类而不是this.getClass()

我正在修改我的InputStream代码

InputStream stream = this.getClass().getResourceAsStream("sessionlog.csv");

更改

InputStream stream = new FileInputStream(new File("URL"))

这是解决方案。

您确定成功地将CSV文件作为类的资源加载吗?看起来InputStream可能为null。

我的fileuplaad.xhtml如下所示

  <html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">

    <h:form id="downloadFileForm">
            <p:commandButton id="downloadLink" value="Download"                                                                             ajax="false"
                                                onclick="PrimeFaces.monitorDownload(start, stop)"
                                                icon="ui-icon-arrowthichk-s">
                                                <p:fileDownload value="#{fileDownloadController.file}" />
                                            </p:commandButton>

        </h:form>
    </html>
Here is my bean:
@ManagedBean(name="fileDownloadController")
public class FileDownloadController implements Serializable {

    private static final long serialVersionUID = 1L;
    private StreamedContent file;  

    public FileDownloadController() {          
        InputStream stream = ((ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext()).getResourceAsStream("/download/FileName.csv");  
        file = new DefaultStreamedContent(stream, "download/csv", "FileName.csv");  
    }  
    public StreamedContent getFile() {  
        return file;  
    }    
}

最新更新