2011-08-28 10 views
5

p: download di file da p: datatable con il bean gestito ViewScoped non funziona. Chiama i metodi prepareFile e getFile due volte. In prima chiamata dei metodi che ho citato, imposta il primo file dalla tabella e, nel secondo richiamo dei metodi, imposta il file giusto, ma scarica sempre solo il primo e il secondo non viene mai scaricato.Problema Primefaces: p: download scaricato da p: datatable con bean gestito ViewScoped

Perché chiama due volte? Perché imposta il primo file dal tavolo? Qualche idea?

Ecco il mio codice:

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

e bean gestito (semplificato):

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

Così, ho fatto una soluzione con un semplice p: confirmDialog dove ho estratto l'ajax problematico = false comando link, quindi seleziono l'allegato cliccandolo in p: datatable ed eseguo il download da p: confirmdialog.

+0

Ho anche provato a passare rowIndex come af: param, ma invia sempre lo stesso rowIndex: solo il primo su cui si è fatto clic. Penso che il problema potrebbe riguardare questo ajax = falso, ma non sono sicuro ... Sto usando PrimeFaces 2.2.1. e Glassfish 3.1 – d1van

+0

Ora sembra che il bean sia stato distrutto. Scarica il file giusto, ma quando provo qualche azione, ottengo 'SEVERE: com.sun.faces.mgbean.ManagedBeanCreationException: Si è verificato un errore durante l'esecuzione di un'iniezione di risorse su beanOffBean gestito' – d1van

risposta

1

Ho avuto lo stesso problema in 2.2.1. Ho trovato la soluzione sostituendo p:commandLink a p:commandButton con gli stessi attributi. Sembra che si tratta di un bug relativo al comportamento del commandLink componente

0

La soluzione che ha funzionato per me è stato quello di sostituire "p: DataTable" con "ui: repeat (facelets) e tavola", in questo modo:

<table role="grid"> 
<thead> 
    <tr role="row"> 
     <th>File Name</th> 
     <th>Action</th> 
    </tr> 
</thead> 
<tbody> 
    <ui:repeat value="#{downloadFileBean.files}" var="f"> 
     <tr role="row"> 
      <td><h:outputText value="#{f.name}" /></td> 
      <td> 
       <p:commandLink id="download" ajax="false"> 
        <h:outputText value="Download" /> 
        <p:fileDownload value="#{downloadFileBean.file}" /> 
        <f:param name="fileName" value="#{f.name}" /> 
       </p:commandLink> 
      </td> 
     </tr> 
    </ui:repeat> 
</tbody> 

Problemi correlati