Java.lang.IllegalStateException: Cannot forward after response has been committed

Galera tenho um servlet controlador para toda a minha aplicação (até aí tudo certo pois fiz várias pesquisar e nenhum me indicou que isso gerava problema).

Esse chama uma classe de negócio via reflection.
Até ai também tudo bem pois não tenho problemas com várias instancias da aplicação… mas estou tendo problemas quando uma requisição é executada simultanemamente.

me gera o erro:

java.lang.IllegalStateException: Cannot forward after response has been committed

Há uma suspeita que seja problema com o forward() do servlet ou flush() do response porém nenhum fórum me auxiliou REALMENTE em solver essa falha no meu código.

e não consigo identificar onde ele ocorre pois via debug funciona corretamente.

Agradeço muito se algué puder me ajudar.

Desde já Obrigado!

Envie seu código pra gente ver!

Provavelmente vc está dando o forward depois de escrever no response.

public class FrameServlet extends HttpServlet {

private String url = "";
public HttpServletRequest request;
public HttpServletResponse response;
private HashMap map;

protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    
    this.request = request;
    this.response = response;
    
	
    //this.session = request.getSession(false);
    DinamicBean paramBO = null;
    try {
        String sessaoAtiva = (String)request.getSession().getAttribute("sessaoAtiva_clearsessionnever_");
        if (sessaoAtiva == null) {
            goTo("session.out");
            RequestDispatcher dispatcher = request.getRequestDispatcher(url);
            dispatcher.forward(this.request, this.response);
            return;
        }

    	
        String escopo = request.getParameter("escopo");
        // caso não for informado o escopo na página assume o request como default
        if ((escopo == null) || (escopo.trim().equals(""))) {
            escopo = "request";
        }
        
        
        paramBO = getEscopo(escopo);
        
        ParametrosBO pBO =  new ParametrosBO(request.getParameter("executar"));
                                
        String classe = pBO.getBo();
        // caso não for informado o escopo na página assume o request como default
        if ((classe == null) || (classe.trim().equals(""))) {
            throw new Exception("Não existe o parametro classe na pagina ou não foi informada nenhuma classe na mesma");
        }
        
        String metodo = pBO.getMetodo();            
        // caso não for informado o escopo na página assume o request como default
        if ((metodo == null) || (metodo.trim().equals(""))) {
            throw new Exception("Não existe o parametro metodo na pagina ou não foi informado nenhum metodo na mesma");
        }

        String metodoValidacao = pBO.getMetodoValidacao();            
        // caso for informado o metodo de validação
        String[] erros = null;
        if ((metodoValidacao != null) && (!metodoValidacao.trim().equals(""))) {
            DinamicBeanMulti dinBean = invokeBO(classe,metodoValidacao,paramBO);

            // caso o metodo de validação retorne algo joga no request
            if (dinBean != null) 
                request.setAttribute("retorno", dinBean);

            //verifica se deu erro na validação
            erros = (String[])request.getAttribute("erros");
        }
        
        // se não existirem errosn na validação executa o metodo do bo
        if (erros == null) {
            // invoke chama o metodo do bo e pega o retorno do mesmo
            // permite tratar o retorno do metodo do BO
            Object obj = invokeBO(classe,metodo,paramBO);
            //Object objAux = posExecuteBO(obj);
            //if (objAux != null) 
            	//obj = objAux;
            
            //if (obj != null)
            	//request.setAttribute("retorno", obj);
        }
        
    } catch(Exception e) {
    	//System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>> ERRO EXCEPTION");
    	//e.printStackTrace();
    	clearSession("yes");
    	
        if (e instanceof  ErroAmigavelException){
            goTo("erro.amigavel");
        }
        goTo("erro.normal");
        
        Email email = new Email();
        email.enviaErro(e,paramBO.toString());
        
        request.setAttribute("exception", e);
        
    } 
    
    
    if ((this.url == null) || ("".equals(this.url))) {
        request.setAttribute("exception", new Exception("não foi definido um mapeamento de saida (redirecionamento pelo go no método posExecuteBO)"));
        goTo("erro.normal");
    }
    
    RequestDispatcher dispatcher = request.getRequestDispatcher(url);
    dispatcher.forward(this.request, this.response);
    return;
    
}

edite o seu codigo, coloque-o entre ‘code’
envie o printStackTrace tb …

cara não entendi a parte do code mas o stack está aqui.
2005-08-16 15:28:06 StandardWrapperValve[FrameServlet]: Servlet.service() for servlet FrameServlet threw exception
java.lang.IllegalStateException: Cannot forward after response has been committed
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:324)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
at br.com.framework.servlets.FrameServlet.service(FrameServlet.java:128)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:534)

Existe um botao na barra de ferramentas das mensagens aqui do Guj, q se chama Code. Você colocando seu código dentro dele , fica mais legível.

Tente usar esse método , antes do dispatcher.forward.

if (!response.isCommitted()){
   RequestDispatcher dispatcher = request.getRequestDispatcher(url); 
   dispatcher.forward(this.request, this.response); 
}
return;

Me parece q o tomcat altera o response( setando o cookie) qdo vc usa o request.getSession(), e a sessao nao está criada.

Outra coisa, esse seu goTo ai … ele nao está alterando o response nao?

1 curtida

Cara descobri a parada!!! era uma outra coisa (foi um erro primario meu)… mas valeu mesmo a ajuda!

Quem estudou matemática ouviu falar deste livro - “How to Solve It” , de G. Polya.

Uma coisa que é legal nesse livro (que não li, infelizmente) é que mesmo que seja orientado a Matemática, seus princípios gerais aplicam-se a qualquer problema. No seu caso, você entendeu o seu problema, bolou um plano, e concretizou seu plano. Aí você conseguiu resolver o problema. A última parte (olhar para trás, para entender porque é que você resolveu o problema) é muito importante, porque você pode resolver outros problemas semelhantes dessa forma.

http://www.math.grin.edu/~rebelsky/ProblemSolving/Essays/polya.html

The four steps are:
* understanding the problem,
* devising a plan,
* carrying out the plan, and
* looking back. 

fiquei curioso … q parada era?

Então cara… eu havia definido alguns atributos para o servlet e esses eram compartilhados para todas as sessões (seguindo o conceito de intanciação de servlet) e justamente um desses atributos era o response.

Foi simplesmentes retirar os atributos e passá-los como parametros dos métodos!

cara as vezes a gante não enxerga o mais simples!!!

Mas valeu a força!!!

nao entendi nada…

mas vlw a força :S

estou com o mesmo erro!

o $%* do Servllet da erro na hora do Foward():

http://www.guj.com.br/posts/list/0/142350.java