Vraptor problema com servidor

Boa noite,

Pessoal tenho um sistema em meu emprego, estava funcionando normalmente, atualizei o servidor tomcat, e começou esse erro e não estou conseguindo resolver, alguém poderia ajudar???

HTTP Status 500 - exception raised, check root cause for details: java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed


type Exception report

message exception raised, check root cause for details: java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed

description The server encountered an internal error (exception raised, check root cause for details: java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed) that prevented it from fulfilling this request.

exception

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed
br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:96)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:89)
br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23)
br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
br.com.caelum.vraptor.ioc.guice.GuiceProvider.provideForRequest(GuiceProvider.java:76)
br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

root cause

java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed
org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:483)
javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:138)
br.com.caelum.vraptor.http.VRaptorResponse.sendRedirect(VRaptorResponse.java:46)
br.com.caelum.vraptor.view.DefaultLogicResult$2.intercept(DefaultLogicResult.java:124)
br.com.caelum.vraptor.proxy.AbstractCglibProxifier$2.intercept(AbstractCglibProxifier.java:56)
br.com.jucesp.controller.HistoricosController$$EnhancerByCGLIB$$adc98e7b.editar()
br.com.jucesp.controller.ProcessosController.altera(ProcessosController.java:177)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:89)
br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23)
br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
br.com.caelum.vraptor.ioc.guice.GuiceProvider.provideForRequest(GuiceProvider.java:76)
br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.29 logs.

java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed

vc tá fazendo alguma chamada ao request/response direto, sem usar o Result?

Bom dia,

Lucas, não estou usando result em todas.

Lucas o codigo esta da segunte forma:

@Restrito
@Post
@Path("/alteraProc")
public void altera(Processos processos) throws EmailException {

	// teste do lado do servidor se não esta indo nada null
	if (processos.getStatus().getIdStatus() == null) {
		this.validator.add(new ValidationMessage("Selecine um Status!!!",
				"processos.idStatus"));
	}

	this.validator.onErrorForwardTo(ProcessosController.class).editar(
			processos.getIdProcessos());

	this.pdao.atualiza(processos);

	Escritorios esc = edao.carregaEsc(processos.getEscritorios()
			.getIdEscritorios());

	String login = loginWeb.getNomeUsuario();
	String emailUser = loginWeb.getEmail();
	String senhaUser = loginWeb.getEmailSenha();

	/*
	 * teste o status(EXIGÊNCIA ASSESSORIA E EXIGÊNCIA EXPEDIÇÃO) do
	 * processo para disparar email para o cliente
	 */

	if (processos.getStatus().getIdStatus() == 1) {
		if (esc.getEmailPrincipal() == null
				|| esc.getEmailPrincipal() == "") {

			result.redirectTo(ProcessosController.class).enviaemail(
					processos.getIdProcessos());
		} else {
			email.EmailExig(processos, esc, login, emailUser, senhaUser);
			result.redirectTo(HistoricosController.class).editar(
					processos.getIdProcessos());
		}
	}

	/* Processo pronto */
	if (processos.getStatus().getIdStatus() == 5) {
		if (esc.getEmailPrincipal() == null
				|| esc.getEmailPrincipal() == "") {

			result.redirectTo(ProcessosController.class).enviaemail(
					processos.getIdProcessos());
		} else {
			email.EmailExig(processos, esc, login, emailUser, senhaUser);
			result.redirectTo(HistoricosController.class).editar(
					processos.getIdProcessos());
		}
	}
	if (processos.getStatus().getIdStatus() == 4) {
		if (esc.getEmailPrincipal() == null
				|| esc.getEmailPrincipal() == "") {
			result.redirectTo(ProcessosController.class).enviaemail(
					processos.getIdProcessos());
		} else {
			email.EmailPronto(processos, esc, login, emailUser, senhaUser);
			result.redirectTo(HistoricosController.class).editar(
					processos.getIdProcessos());
		}
	}

	else {
		result.redirectTo(HistoricosController.class).editar(
				processos.getIdProcessos());
	}
}

Normalmente esse problema é provocado por algum espacinho antes da declaração de page do jsp, ou entre trechos de scripts.

Alguma coisa no seu ciclo de resposta da web está mandando um “response.write()” antes do seu sendRedirect(). Se você está usando jsp, verifique a servlet que o tomcat gerou…

Ops… mal aê… Não vi que você estava usando esse vraptor aí…

Mas o princípio é o mesmo: você possui uma cadeia de interceptação, todas elas potencialmente produzindo um response.write. Aí depois que o response.write foi chamado, alguém deu um response.sendRedirect.

boy_bauru28, coloque seu código entre e , pra formatar direitinho.

pelo que eu percebi no seu código, tem casos em que acontece mais de um redirect.

chamar o …redirectTo não pára a execução do método do controller… se era isso que vc queria, precisa dar um return.

Então

abmpicoli

o pior é que estava tudo funcionando, apenas atualizei o servidor.

Então Lucas mas pode vir a dar erro, se estava funcionando normalmente??

@Restrito
	@Post
	@Path("/alteraProc")
	public void altera(Processos processos) throws EmailException {

		// teste do lado do servidor se não esta indo nada null
		if (processos.getStatus().getIdStatus() == null) {
			this.validator.add(new ValidationMessage("Selecine um Status!!!",
					"processos.idStatus"));
		}

		this.validator.onErrorForwardTo(ProcessosController.class).editar(
				processos.getIdProcessos());

		this.pdao.atualiza(processos);

		Escritorios esc = edao.carregaEsc(processos.getEscritorios()
				.getIdEscritorios());

		String login = loginWeb.getNomeUsuario();
		String emailUser = loginWeb.getEmail();
		String senhaUser = loginWeb.getEmailSenha();

		/*
		 * teste o status(EXIGÊNCIA ASSESSORIA E EXIGÊNCIA EXPEDIÇÃO) do
		 * processo para disparar email para o cliente
		 */

		if (processos.getStatus().getIdStatus() == 1) {

			if (esc.getEmailPrincipal() == null
					|| esc.getEmailPrincipal() == "") {

				result.redirectTo(ProcessosController.class).enviaemail(
						processos.getIdProcessos());
			} else {
				email.EmailExig(processos, esc, login, emailUser, senhaUser);
				result.redirectTo(HistoricosController.class).editar(
						processos.getIdProcessos());
			}
		}

		/* Processo pronto */
		if (processos.getStatus().getIdStatus() == 5) {

			if (esc.getEmailPrincipal() == null
					|| esc.getEmailPrincipal() == "") {

				result.redirectTo(ProcessosController.class).enviaemail(
						processos.getIdProcessos());
			} else {
				email.EmailExig(processos, esc, login, emailUser, senhaUser);
				result.redirectTo(HistoricosController.class).editar(
						processos.getIdProcessos());
			}
		}
		if (processos.getStatus().getIdStatus() == 4) {

			if (esc.getEmailPrincipal() == null
					|| esc.getEmailPrincipal() == "") {
				result.redirectTo(ProcessosController.class).enviaemail(
						processos.getIdProcessos());
			} else {
				email.EmailPronto(processos, esc, login, emailUser, senhaUser);
				result.redirectTo(HistoricosController.class).editar(
						processos.getIdProcessos());
			}
		}

		else {
			result.redirectTo(HistoricosController.class).editar(
					processos.getIdProcessos());
		}
	}

se passar por dois redirects diferentes ele dá o erro que vc postou. Só pode passar por um!

to vendo que tem varios redirects iguais nesse método… tente refatorar isso pra só mandar o redirect no final qdo vc já tiver o resultado…

os seus ifs tem o mesmo corpo, isso não tá errado? não é melhor colocar tudo num if só?

Cara, muitas coisas podem ter acontecido nessa “subida de servidor”. Você só pegou o war que estava funcionando e jogou no servidor novo? Ou você recompilou o fonte? Se recompilou, tem certeza que mandou a versão certa? Se não, será que você não pegou um War da pasta errada? Será que funcionava porque alguma coisa estava em cache, e agora não?

Outra coisa: ter subido o servidor pode ter sido apenas uma coincidência em relação ao problema que está relatando… Será que só agora apareceu algum problema de lógica no seu programa, que estava ali o tempo todo, mas só agora você bateu nele?

Minha aposta aqui é que o problema já existia, mas até agora nenhuma situação que quebrava seu código apareceu…

Outra coisa, alguns problemas , tipicamente relacionados à inicialização, só aparecem quando o servidor (ou a aplicação, no caso de containers Web) é reiniciado. Por exemplo, inicialização de variáveis estáticas…

Então Lucas mas é o seguinte, eu tenho varios status do “processo”, mas também testo se os email estão vazio ou nulo, então por isso esses if

e para cada situação encaminha para um lugar, não poderia ser assim?

abmpicoli,

estou verificando a logica, o Lucas também me atentou, mas é que faço vários teste, acho que em algum posso esta errando.

Cara, concordo com o Lucas nisso. Olha o último else no seu código: ele diz que se o status for diferente de 4, ele manda um redirect. Portanto, se o status for 5, seu código mandaria dois redirects…

Então mas e que dentro de um teste tenho outro, estou tentando refazer a logica.

Pessoal, corrigir meu controller da seguinte forma:

@Restrito
	@Post
	@Path("/alteraProc")
	public void altera(Processos processos) throws EmailException {

		if (processos.getStatus().getIdStatus() == null) {
			this.validator.add(new ValidationMessage("Selecine um Status!!!",
					"processos.idStatus"));
		}

		this.validator.onErrorForwardTo(ProcessosController.class).editar(
				processos.getIdProcessos());

		this.pdao.atualiza(processos);

		Escritorios esc = edao.carregaEsc(processos.getEscritorios()
				.getIdEscritorios());

		String login = loginWeb.getNomeUsuario();
		String emailUser = loginWeb.getEmail();
		String senhaUser = loginWeb.getEmailSenha();

		if (processos.getStatus().getIdStatus() == 1
				|| processos.getStatus().getIdStatus() == 5) {
			email.EmailExig(processos, esc, login, emailUser, senhaUser);
		}
		if (processos.getStatus().getIdStatus() == 4) {
			email.EmailPronto(processos, esc, login, emailUser, senhaUser);
		}

		result.redirectTo(HistoricosController.class).editar(
				processos.getIdProcessos());
	}

mas agora preciso fazer um teste, nos emails pois tenho contatos sem email, ai da erros, mas já estou corrigindo, assim que fizer já posto também.

obrigado por enquanto a atenção de vocês.

Boa tarde,

Amigos resolve o código da seguinte forma:

@Restrito
	@Post
	@Path("/alteraProc")
	public void altera(Processos processos) throws EmailException {

		if (processos.getStatus().getIdStatus() == null) {
			this.validator.add(new ValidationMessage("Selecine um Status!!!",
					"processos.idStatus"));
		}

		this.validator.onErrorForwardTo(ProcessosController.class).editar(
				processos.getIdProcessos());

		this.pdao.atualiza(processos);

		Escritorios esc = edao.carregaEsc(processos.getEscritorios()
				.getIdEscritorios());

		String login = loginWeb.getNomeUsuario();
		String emailUser = loginWeb.getEmail();
		String senhaUser = loginWeb.getEmailSenha();

		if (esc.getEmailPrincipal() == null || esc.getEmailPrincipal() == "") {
			result.redirectTo(ProcessosController.class).enviaemail(
					processos.getIdProcessos());
		} else {
			if (processos.getStatus().getIdStatus() == 1
					|| processos.getStatus().getIdStatus() == 5) {
				email.EmailExig(processos, esc, login, emailUser, senhaUser);
			}
			if (processos.getStatus().getIdStatus() == 4) {
				email.EmailPronto(processos, esc, login, emailUser, senhaUser);
			}

			result.redirectTo(HistoricosController.class).editar(
					processos.getIdProcessos());
		}
	}

Agora esta funcionando o teste do email também, mas uma vez obrigado pela atenção dos colegas.