Primefaces下载文件java.io.IOException:第二次后流关闭

Primefaces下载文件java.io.IOException:第二次后流关闭,primefaces,jsf-2.2,Primefaces,Jsf 2.2,我对primefaces 5.0组件p:fileDownload有问题,我有以下bean storeDefaultStreamedContent,我得到存储的值来下载它: 豆子: public class EBMail implements Serializable { private DefaultStreamedContent attachment; // @ here setter and getter too . } 从XHTML文件: <p:commandLin

我对primefaces 5.0组件p:fileDownload有问题,我有以下bean store
DefaultStreamedContent
,我得到存储的值来下载它:

豆子:

public class EBMail implements Serializable {
    private DefaultStreamedContent attachment;
    // @ here setter and getter too .
}
从XHTML文件:

<p:commandLink ajax="false" value="Download Attachment" rendered="#{mbMail.attachment != null}">
    <p:fileDownload value="#{mbMail.attachment}" />
</p:commandLink>
我在JFS 2.2.7和Primefaces 5.0上运行,当我第二次下载文件时,我会将文件上传到bean中,即使是另一个对象“邮件”


任何解决方案,我都会关注周围的许多解决方案,没有任何帮助,或者我已经对其进行了测试。

我最终解决了这个问题,我让新类存储我的数据,以及准备从我的类对象下载流的操作,当下载文件时,我从我的类字节中读取字节,如下所示:

类别:

public class Attachment implements Serializable {

    private String name;
    private String type;
    private String encoding;
    private byte[] data;

    // ... Setters and getters ...

    public Attachment () {
        this.encoding = "UTF-8";
    }

}
豆子:

public class MailBean implements Serializable {
    // alot of properties
    private Attachment attachment;
    // setters and getters
}
托管Bean:

public class MailManagedBean implements Serializable {
    private DefaultStreamedContent attachmentToDownload;
    private MailBean mail;
    // @ here setter and getter too .

    public void prepare() {
        InputStream stream = new ByteArrayInputStream(mail.getAttachment.getData());
        attachmentToDownload = new DefaultStreamedContent(stream, mail.getAttachment.getType(), mail.getAttachment.getName(), mail.getAttachment.getEncoding());
    }
}
在XHTML文件中(我添加了操作):


public class MailManagedBean implements Serializable {
    private DefaultStreamedContent attachmentToDownload;
    private MailBean mail;
    // @ here setter and getter too .

    public void prepare() {
        InputStream stream = new ByteArrayInputStream(mail.getAttachment.getData());
        attachmentToDownload = new DefaultStreamedContent(stream, mail.getAttachment.getType(), mail.getAttachment.getName(), mail.getAttachment.getEncoding());
    }
}
<p:commandLink ajax="false" value="Download Attachment" 
    rendered="#{mbMail.mail.attachment != null}" action="#{mbMail.prepare()}">
    <p:fileDownload value="#{mbMail.attachmentToDownload}" />
</p:commandLink>