PrimeFaces fileDownload不起作用

Han*_*sky 7 jsf download primefaces java-ee-5

我无法得到primeFaces的<p:filedownload工作.我成功使用自定义下载bean下载文件.似乎issu与primefaces文件下载ActionListener有关,但我没有看到如何.有人有线索吗?谢谢.

这是我的豆子:

@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");

    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的观看代码:

<?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>
Run Code Online (Sandbox Code Playgroud)

我收到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
Run Code Online (Sandbox Code Playgroud)

日志:

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)
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 11

InputStream stream = this.getClass().getResourceAsStream("sessionlog.csv");
Run Code Online (Sandbox Code Playgroud)

您找到CSV文件的方式要求它与当前类在同一个包FileDownloadBean.

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

InputStream stream = this.getClass().getResourceAsStream("/sessionlog.csv");
Run Code Online (Sandbox Code Playgroud)

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

InputStream stream = this.getClass().getResourceAsStream("/com/example/sessionlog.csv");
Run Code Online (Sandbox Code Playgroud)

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

InputStream stream = externalContext.getResourceAsStream("/sessionlog.csv");
Run Code Online (Sandbox Code Playgroud)

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

  • 使用`ClassLoader#getResourceAsStream()`,您应该考虑相对于类路径根(即包根).使用`ExternalContext#getResourceAsStream()`你应该考虑相对于webapp根(即WebContent文件夹).当你想直接从本地磁盘文件系统中获取它们时,你应该使用带有绝对磁盘文件系统路径的`FileInputStream`. (3认同)