1

我有这样的结构:

<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;
}

你可以帮帮我吗?谢谢。

4

1 回答 1

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 并将其设置为按钮。

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

于 2013-07-23T15:23:16.420 回答