Jesteśmy strumieniowe plik binarny dla naszych użytkowników, zgodnie z procedurą opracowana w SO pytanie How to provide a file download from a JSF backing bean?Jak przesyłać strumieniowo plik do pobrania i wyświetlać komunikat twarzy JSF?
w ogóle workflow działa zgodnie z przeznaczeniem, ale podczas generowania pliku eksportu mogą wystąpić wydobywalne błędy i chcemy aby wyświetlić je jako ostrzeżenie dla użytkownika. Sam plik nadal będzie generowany w takim przypadku. Chcemy, aby ten eksport był kontynuowany, aby kontynuować wyświetlanie komunikatów.
Tylko po to, aby położyć nacisk na to: Tak, jest coś nie w porządku z danymi, ale nasi użytkownicy chcą, aby eksport kontynuował i otrzymywał ten wadliwy plik. Następnie chcą rzucić okiem na plik, skontaktować się z jego sprzedawcą i wysłać mu wiadomość o wadzie.
W każdym razie potrzebuję eksportu.
Ale to nie działa tak, jak tego chcemy. Stworzyłem uproszczony przykład ilustrujący nasze podejście.
Jako alternatywę rozważamy Groszek, który będzie przechowywać wiadomości i wyświetlać je po eksporcie. Prawdopodobnie istnieje sposób wbudowania mechanizmów JSF, aby to osiągnąć.
Controller
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import org.apache.tomcat.util.http.fileupload.util.Streams;
@ManagedBean
@RequestScoped
public class ExportController {
public void export() {
FacesContext fc = FacesContext.getCurrentInstance();
ExternalContext ec = fc.getExternalContext();
byte[] exportContent = "Hy Buddys, thanks for the help!".getBytes();
// here something bad happens that the user should know about
// but this message does not go out to the user
fc.addMessage(null, new FacesMessage("record 2 was flawed"));
ec.responseReset();
ec.setResponseContentType("text/plain");
ec.setResponseContentLength(exportContent.length);
String attachmentName = "attachment; filename=\"export.txt\"";
ec.setResponseHeader("Content-Disposition", attachmentName);
try {
OutputStream output = ec.getResponseOutputStream();
Streams.copy(new ByteArrayInputStream(exportContent), output, false);
} catch (IOException ex) {
ex.printStackTrace();
}
fc.responseComplete();
}
}
JSF Page
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<f:view contentType="text/html">
<h:body>
<h:form prependId="false">
<h:messages id="messages" />
<h:commandButton id="download" value="Download"
actionListener="#{exportController.export()}" />
</h:form>
</h:body>
</f:view>
</html>
+1 dla prawidłowego przykładu SSCCE. –
'org.apache.tomcat.util.http.fileupload.util.Streams' jest specyficzne dla Tomcat. – BalusC