我有这样的结构:
<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;
}
你可以帮帮我吗?感谢。
答案 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并将其设置为按钮。
祝你好运,我很确定这会解决它。另外 - 确保您的“下载对象”是最终的。您需要确保数据源引用相同的引用,而不是在每个请求上创建新实例。