Primefaces problem: p:filedownload von p:datatable mit ViewScoped managed bean

p:filedownload von p:datatable mit ViewScoped managed bean nicht funktionieren. Es ruft die Methoden prepareFile und getFile zweimal. Im ersten Aufruf der Methoden, die ich erwähnt, legt die erste Datei aus der Tabelle, und der zweite Aufruf der Methoden es setzt die richtige Datei, aber es ist immer downloads nur die erste und die zweite ist nie heruntergeladen.

Warum es zweimal rufen? Warum setzt Sie die erste Datei aus der Tabelle? Irgendwelche Ideen?

Hier ist mein code:

<p:dataTable id="offer_attachment_datatable"
                     widgetVar="offer_attachment_datatable"
                     var="attachment"
                     value="#{offerBean.offerAttachments}">
            <p:column>
                <f:facet name="header"/>
                <p:commandLink ajax="false" actionListener="#{offerBean.prepareFile(attachment)}" title="#{attachment.name}">
                    <p:graphicImage value="/resources/themes/navigator_b2e/images/drive-download.png" />
                    <p:fileDownload value="#{offerBean.file}"/>
                </p:commandLink>
            </p:column>
</p:dataTable>

und in der managed bean (vereinfacht):

private StreamedContent file;
private InputStream stream;

public void prepareFile(OfferAttachment attachment){
    System.out.println("Attachment: "+attachment.getName());
    stream = new ByteArrayInputStream(attachment.getAttachment());
    file = new DefaultStreamedContent(stream, "text/plain", attachment.getName());
    stream = null;
}

public StreamedContent getFile() {
    System.out.println("File: "+file.getName());
    return file;
}

public void setFile(StreamedContent file) {
    this.file = file;
}

So, ich habe einen workaround mit einem einfachen p:confirmDialog wo ich extrahiert die problematische ajax=false Befehl link, so dass ich wählen Sie die Anlage aus, indem Sie es in p:datatable und führen Sie den download aus dem p:confirmdialog.

  • Ich habe auch versucht, die übergabe der rowIndex als f:param, aber es sendet immer die gleiche rowIndex: nur das erste angeklickt. Ich denke problem könnte sein, um dieses ajax=false, aber ich bin mir nicht sicher... ich bin mit PrimeFaces 2.2.1. und Glassfish 3.1
  • Jetzt scheint es, wie die bean wird zerstört. Es lädt die richtige Datei, aber wenn ich versuche eine Aktion nach, die ich bekommen SEVERE: com.sun.faces.mgbean.ManagedBeanCreationException: An error occurred performing resource injection on managed bean offerBean
InformationsquelleAutor d1van | 2011-08-28
Schreibe einen Kommentar