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.
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;
}
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)
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!!!