2011-08-28 32 views
5

p: descarga de archivo de p: datatable con ViewScoped managed bean no funciona. Llama a los métodos prepareFile y getFile dos veces. En la primera llamada de los métodos que mencioné establece el primer archivo de la tabla, y en la segunda llamada de los métodos establece el archivo correcto, pero siempre descarga solo el primero y el segundo nunca se descarga.Problema de Primefaces: p: descarga de archivo de p: datatable con bean gestionado ViewScoped

¿Por qué llama dos veces? ¿Por qué establece el primer archivo de la tabla? ¿Algunas ideas?

Aquí está mi código:

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

y en el bean gestionado (simplificado):

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

Por lo tanto, hice una solución con una simple p: confirmDialog donde extraje el Ajax problemática = false comando, así que selecciono el archivo adjunto haciendo clic en p: datatable y ejecuto la descarga desde p: confirmdialog.

+0

También he intentado pasar el rowIndex como af: param, pero siempre envía el mismo rowIndex: solo el primero en el que se hizo clic. Creo que el problema podría estar alrededor de este ajax = falso, pero no estoy seguro ... estoy usando PrimeFaces 2.2.1. y Glassfish 3.1 – d1van

+0

Ahora parece que el frijol está destruido. Descarga el archivo correcto, pero cuando pruebo alguna acción después de eso, obtengo 'SEVERE: com.sun.faces.mgbean.ManagedBeanCreationException: Se ha producido un error al realizar la inyección de recursos en beans gestionados offerBean' – d1van

Respuesta

1

Tuve el mismo problema en 2.2.1. Encontré la solución reemplazando p:commandLink por p:commandButton con los mismos atributos. Parece que se trata de un error relacionado con el comportamiento del componente commandLink

0

La solución que funcionó para mí fue la de sustituir "t: tabla de datos" con "ui: repetición (facelets) y la mesa", como este:

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

Cuestiones relacionadas