Primefaces p:fileDownload里面p:treeTable不起作用?

时间:2013-07-16 16:48:42

标签: jsf-2 primefaces

我有这样的结构:

<p:treeTable value="#{cmpDocumentTree.root}" var="v" id="#{tableId}" selectionMode="single"
        selection="#{cmpDocumentTree.selectedNode}">
        <p:ajax event="expand" listener="#{cmpDocumentTree.onNodeExpand}" />
        <p:ajax event="collapse" listener="#{cmpDocumentTree.onNodeCollapse}" />
        <p:ajax event="select" listener="#{crudBean.edit(cmpDocumentTree.selectedNode.data)}"
            update=":#{formDialogUpdate}" oncomplete="#{formDialog}.show()" />
        <p:column headerText="Nazwa" sortBy="#{v.name}" style="min-width: 200px;">
            <h:outputText value="#{v.name}" />
        </p:column>
        <p:column headerText="Pliki" width="300">
            <ui:repeat var="_file1" value="#{v.files}">
                <h:commandLink value="#{_file1.originalFilename}">
                    <p:fileDownload
                        value="#{fileDownloadController.getFile(_file1.originalFilename, _file1.storedFilename, _file1.contentType)}" />
                </h:commandLink>
                <br />
            </ui:repeat>
        </p:column>
</p:treeTable>

但是 - p:fileDownload不起作用。根本不会触发fileDownloadController.getFile(...)方法。 当我在p:dataTable中放入相同的方法时,它可以很好地工作。

修改

v.files来自ComDocument实体 - 它是一对多文档到文件的关系。

@Entity
@Table(name = "com_documents", schema = "public")
@SequenceGenerator(name = "COM_DOCUMENTS_SEQ", sequenceName = "COM_DOCUMENTS_SEQ", allocationSize = 1)
public class ComDocument implements EntityInt, java.io.Serializable {
(...)
@OneToMany(fetch = FetchType.EAGER, mappedBy = "document", cascade = CascadeType.ALL, orphanRemoval = true)
private List<ComDocumentFile> files;

public void setFiles(List<ComDocumentFile> files) {
    this.files = files;
}

public List<ComDocumentFile> getFiles() {
    return files;
}
你可以帮帮我吗?感谢。

1 个答案:

答案 0 :(得分:3)

我从来没有幸运过在ajax请求中工作的FileDownload。我并不打算深入挖掘源代码,因为它永远不是一个显示停止者(并且将它用作ajax请求真的没有意义 - 你得到一个完整的文件,而不是更新页面)。

这里的简单解决方案是确保您的命令按钮具有“ajax = false”

<p:commandLink value="#{_file1.originalFilename}" ajax="false">
  <p:fileDownload
    value="#{fileDownloadController.getFile(_file1.originalFilename, file1.storedFilename,        _file1.contentType)}" />
</p:commandLink>

http://www.primefaces.org/showcase/ui/fileDownload.jsf

您会注意到所有示例都禁用了ajax功能。如果您使用h:commandButton作为样式我建议使用p:commandLink并将其设置为按钮。

祝你好运,我很确定这会解决它。另外 - 确保您的“下载对象”是最终的。您需要确保数据源引用相同的引用,而不是在每个请求上创建新实例。