getOutputStream() has already been called for this response

Fala pessoal do GUJ.
Sei que existem outros Tópicos com esse assunto, mas olhei todos que encontrei e não consegui resolver meu problema.
Bem Vamos lá …

Iniciei a pouco tempo a utilização do Jasper em meus relatórios. Eu gero os arquivos da seguinte forma:

	/**
	 * @param relatorioPontoJasper - Nome do arquivo jasper compilado ( o mesmo tem que estar na pasta padrão)
	 * @param parametros - Map de Parametros	
	 * @param extensao -	aceita PDF, RTF e XLS 
	 * @param NomeArquivoSaida - Nome do arquivo de saída
	 * @throws EsferaException - lança uma exception
	 */
	public void doPost(String relatorioPontoJasper, Map<String, Object> parametros, String extensao, 
			String NomeArquivoSaida) throws EsferaException {
		
		con = getConnection();
		// Na variavel pathJasper ficara o caminho do diretório para os relatórios compilados (.jasper)
		String pathJasper = getRaiz()+"/jasper/";
		// Local no disco onde o arquivo será gravado
		//System.out.println("JasperUtil.doPost()"+getRaiz());
		String path = getRaiz()+"//arquivosRelatatorios//";
		if (!new File(path).exists()) { // Verifica se o diretório existe.   
			(new File(path)).mkdir();   // Cria o diretório   
        }  
		try {			
			// Aqui ele cria o relatório
			JasperPrint jasperprint = JasperFillManager.fillReport(pathJasper+ relatorioPontoJasper, parametros, con);
			
			
			if("pdf".equalsIgnoreCase(extensao) ){  
				JRPdfExporter exporterPDF = new JRPdfExporter();  
	            exporterPDF.setParameter(JRExporterParameter.JASPER_PRINT, jasperprint);  
	            exporterPDF.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, path+ "/"+NomeArquivoSaida+".pdf");  
	            exporterPDF.exportReport();              	            
				//res.sendRedirect(path+ "/"+NomeArquivoSaida+".pdf");
	            baixarArquivo(path+ "/"+NomeArquivoSaida+".pdf");
	            //return (path+ "/"+NomeArquivoSaida+".pdf");		
				
            }else if("rtf".equalsIgnoreCase(extensao) ){  
                JRRtfExporter exporterRTF = new JRRtfExporter();  
                exporterRTF.setParameter(JRExporterParameter.JASPER_PRINT, jasperprint);  
                exporterRTF.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, path+ "/"+NomeArquivoSaida+".rtf");  
                exporterRTF.exportReport(); 
                baixarArquivo(path+ "/"+NomeArquivoSaida+".rtf");
                //return (path+ "/"+NomeArquivoSaida+".rtf");
                
			}else if("xls".equalsIgnoreCase(extensao) ){
	            JRXlsExporter exporterXLS = new JRXlsExporter();  
	            exporterXLS.setParameter(JRExporterParameter.JASPER_PRINT, jasperprint);  
	            exporterXLS.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, path+ "/"+NomeArquivoSaida+".xls");  
	            exporterXLS.exportReport();  
	            exporterXLS.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,Boolean.FALSE);
	            baixarArquivo(path+ "/"+NomeArquivoSaida+".xls");	     
	            //return (path+ "/"+NomeArquivoSaida+".xls");
	        }else{
	        	//return null;
	        }
		}catch (Exception e) {
			e.printStackTrace();
			throw new EsferaException("Erro ao gerar o Relatório");
		}
	}

Em seguida pego o arquivo gerado e envio para download assim :

// Irá baixar o arquivo
	public void baixarArquivo(String urlCompleta) throws EsferaException{
		File f = new File(urlCompleta);		
		EsferaUtils.download(f, this.res);
	}
	


    public static void download( File file, HttpServletResponse response ){  
    	 try {
			download( file.getName(), read( file ), response );
		} catch (IOException e) {
			e.printStackTrace();
		}  
     }  


        public static void download( String filename, byte[] content,  
	     HttpServletResponse response ) throws IOException {  
	     response.addHeader( "Content-Disposition", "attachment; filename=" + filename );  
	     response.setContentType( "application/octet-stream" );
	     if(outStream==null){
	    	 outStream = response.getOutputStream(); 
	     }		   
         // envia o conteúdo do arquivo para o stream de resposta  
	     try {  
 	        outStream.write( content );  
	        outStream.flush();  
	     } finally {  
	    	 if(outStream!=null) outStream.close();        
	     }  
	}  

Bem eu sempre recebo a exception…

java.lang.IllegalStateException: getOutputStream() has already been called for this response

mas como tem try-catch o código continua sendo executado.
Caso eu esteja gerando o relatório pela primeira vez ele lança a exception, mas funciona normal e o arquivo é baixado corretamente.
Mas caso eu mande gerar o relatório novamente aí dá pau :twisted: gerando um arquivo corrompido que não tem como abrir.
Estava lendo que a maneira correta de fazer o download é atravez de servelet. Mas não sei ao certo como fazer .

Outra coisa … também gostaria que o arquivo não fosse salvo no servidor e que o download fosse feito diretamante (se possivel).

Agradeço a todos que responderem

Trabalho com pdf da mesma forma e nao tive problemas.

            response.setContentType("application/pdf");
            ServletOutputStream out = response.getOutputStream();
            out.write(bytePdf);
            out.flush();
            out.close();

Este doPost seu esta em uma Servlet ?, a assinatura esta diferente e percebi que seu response eh uma instancia da classe.

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
....

é na verdade eu mando o response como parametro de uma outra classe minha (Action implements SessionAware, ServletContextAware, ServletRequestAware, ServletResponseAware {…)

Então … já fiz como vc falou

  response.setContentType("application/pdf");  
 ServletOutputStream out = response.getOutputStream();  
 out.write(bytePdf);  
 out.flush();  
 out.close(); 

pra PDF beleza aí abre direto no browser. É que no meus caso o usuário pode optar por gerar um arquivo RTF, XLS ou PDF

Mas essa parte do Jasper a tá beleza até . Meu problema tá sendo na hora de fazer o download do arquivo.

Obrigado :smiley:

Você dá um forward pra algum jsp depois do out.flush() ?

Sim … Depois que executa tudo, o strus me redireciona para a tela do filtro do relatório novamente.

Puts … não consigo resolver esse erro …
O pior é que o sistema já está implantado e a galera da empresa tá arrancando meu coro por causa disso :frowning:

entao o erro é esse, vc ja enviou a resposta, a servlet morre ai, nao pode enviar forward.

Aeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
:smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley:
Cara não é que era isso mesmo :lol:

Estava enviando e resposta duas vezes.
Enviava o arquivo para download em seguida o Struts enviava a resposta de novo (redirecionando para um jsp)

Obrigado vdb !
Obrigado furutani !

Eu já estava quase entrando em desespero . hauhauhauhauah

Obrigado mesmo :!:

Puts … Tava funcionando agora voltou a dar Pau :frowning:

Não sei qual objeto está chegando nulo para lançar essa java.lang.NullPointerException


Hibernate: select this_.codGrpComitente101 as codGrpCo1_5_0_, this_.logDtaCriacao as logDtaCr2_5_0_, this_.logDtaEdicao as logDtaEd3_5_0_, this_.logUsuario as logUsuario5_0_, this_.nomGrupo101 as nomGrupo5_5_0_, this_.numero101 as numero6_5_0_ from banseg.t101grupocomitente this_
java.lang.NullPointerException
	at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:747)
	at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:432)
	at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:347)
	at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:770)
	at org.apache.coyote.http11.filters.ChunkedOutputFilter.end(ChunkedOutputFilter.java:164)
	at org.apache.coyote.http11.InternalOutputBuffer.endRequest(InternalOutputBuffer.java:397)
	at org.apache.coyote.http11.Http11Processor.action(Http11Processor.java:1010)
	at org.apache.coyote.Response.action(Response.java:183)
	at org.apache.coyote.Response.finish(Response.java:305)
	at org.apache.catalina.connector.OutputBuffer.close(OutputBuffer.java:281)
	at org.apache.catalina.connector.CoyoteOutputStream.close(CoyoteOutputStream.java:104)
	at br.com.esfera.utils.EsferaUtils.download(EsferaUtils.java:286)
	at br.com.esfera.utils.EsferaUtils.download(EsferaUtils.java:231)
	at br.com.esfera.utils.JasperUtil.baixarArquivo(JasperUtil.java:134)
	at br.com.esfera.utils.JasperUtil.doPost(JasperUtil.java:79)
	at br.com.esfera.control.relatorios.action.ConfereJasPerAction.relatorio(ConfereJasPerAction.java:51)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:404)
	at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:267)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:229)
	at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:221)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150)
	at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:48)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:123)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:186)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:105)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:83)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:207)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:74)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:127)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:107)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:206)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:115)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:143)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:121)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:170)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:123)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:50)
	at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:504)
	at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
	at java.lang.Thread.run(Unknown Source)

EsferaUtils.java:286

	    	 if(outStream!=null) outStream.close();        
    /**
     * Trabalha em cojunto com os métodos  read e download( File file, HttpServletResponse response )
     * quem efetivamente força o download é o método abaixo , mas voce sempre deverá chamar 
     * download( File file, HttpServletResponse response )
     * @param filename
     * @param content
     * @param response
     * @throws IOException
     */
	 public static void download( String filename, byte[] content,  
	     HttpServletResponse response ) throws IOException {  
	     response.addHeader( "Content-Disposition", "attachment; filename=" + filename );  
	     response.setContentType( "application/octet-stream" );
	     if(outStream==null){
	    	 outStream = response.getOutputStream(); 
	     }		   
         // envia o conteúdo do arquivo para o stream de resposta  
	     try {  
	    	 if(outStream!=null){
	 	        outStream.write( content );  
		        outStream.flush();  
	    	 }
	     } finally {  
	    	 if(outStream!=null) outStream.close();        
	     }  
	}  

Agradeço todos os comentários.

O problema me parece ser no hibernate, verifique se nenhum campo integer, float ou doble, nao esteja null no banco de dados, pois se tiver null e sua classe esta int, double ou float, vair ter problema com NullPointerException.

Não é . O arquivo é gerado corretamente no servidor .
O problema está no download.
Tem algo que eu possa melhorar nesse download ?
Ou tem alguma coisa do struts que eu possa usar pra fazer o download do arquivo ?