Java.lang.IllegalStateException: Cannot forward after response has been committed
10 respostas
S
salnet01
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.
Provavelmente vc está dando o forward depois de escrever no response.
S
salnet01
public class FrameServlet extends HttpServlet {
privateStringurl="";publicHttpServletRequestrequest;publicHttpServletResponseresponse;privateHashMapmap;protectedvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{this.request=request;this.response=response;//this.session = request.getSession(false);DinamicBeanparamBO=null;try{StringsessaoAtiva=(String)request.getSession().getAttribute("sessaoAtiva_clearsessionnever_");if(sessaoAtiva==null){goTo("session.out");RequestDispatcherdispatcher=request.getRequestDispatcher(url);dispatcher.forward(this.request,this.response);return;}Stringescopo=request.getParameter("escopo");// caso não for informado o escopo na página assume o request como defaultif((escopo==null)||(escopo.trim().equals(""))){escopo="request";}paramBO=getEscopo(escopo);ParametrosBOpBO=newParametrosBO(request.getParameter("executar"));Stringclasse=pBO.getBo();// caso não for informado o escopo na página assume o request como defaultif((classe==null)||(classe.trim().equals(""))){thrownewException("Não existe o parametro classe na pagina ou não foi informada nenhuma classe na mesma");}Stringmetodo=pBO.getMetodo();// caso não for informado o escopo na página assume o request como defaultif((metodo==null)||(metodo.trim().equals(""))){thrownewException("Não existe o parametro metodo na pagina ou não foi informado nenhum metodo na mesma");}StringmetodoValidacao=pBO.getMetodoValidacao();// caso for informado o metodo de validaçãoString[]erros=null;if((metodoValidacao!=null)&&(!metodoValidacao.trim().equals(""))){DinamicBeanMultidinBean=invokeBO(classe,metodoValidacao,paramBO);// caso o metodo de validação retorne algo joga no requestif(dinBean!=null)request.setAttribute("retorno",dinBean);//verifica se deu erro na validaçãoerros=(String[])request.getAttribute("erros");}// se não existirem errosn na validação executa o metodo do boif(erros==null){// invoke chama o metodo do bo e pega o retorno do mesmo// permite tratar o retorno do metodo do BOObjectobj=invokeBO(classe,metodo,paramBO);//Object objAux = posExecuteBO(obj);//if (objAux != null) //obj = objAux;//if (obj != null)//request.setAttribute("retorno", obj);}}catch(Exceptione){//System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>> ERRO EXCEPTION");//e.printStackTrace();clearSession("yes");if(einstanceofErroAmigavelException){goTo("erro.amigavel");}goTo("erro.normal");Emailemail=newEmail();email.enviaErro(e,paramBO.toString());request.setAttribute("exception",e);}if((this.url==null)||("".equals(this.url))){request.setAttribute("exception",newException("não foi definido um mapeamento de saida (redirecionamento pelo go no método posExecuteBO)"));goTo("erro.normal");}RequestDispatcherdispatcher=request.getRequestDispatcher(url);dispatcher.forward(this.request,this.response);return;}
Fabricio_Cozer_Marti
edite o seu codigo, coloque-o entre ‘code’
envie o printStackTrace tb …
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?
S
salnet01
Cara descobri a parada!!! era uma outra coisa (foi um erro primario meu)… mas valeu mesmo a ajuda!
T
thingol
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.
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!!!