微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PrimeFaces文件下载不起作用

如何解决PrimeFaces文件下载不起作用

| 我无法得到primeFaces的“ 0”工作。虽然我使用自定义下载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\");

    }
}
这是我的查看代码
<?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内容的根目录中(在所有其他Web文件中也有
/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文件作为资源从Class加载吗?看起来InputStream可能为null。     ,        我的文件uplaad.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;  
    }    
}
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。