Servidor - 2 redirectTo, como resolver

10 respostas
F

Olá,

No meu site qdo digito dominio.com.br/aaaaaa, que não existe no meu controller, o web.xml trata esse erro como 404 e redireciona para um jsp

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head></head>
<body>
	<script type="text/javascript">
	document.location='<c:url value="/error/404"/>';
	</script>
</body>
</html>

…que depois manda para meu controller

@Get @Public
	@Path(value="/error/{errorCode}")
	public void file(Integer errorCode){
		
		MessagePage message = new MessagePage("error_sorry", "error"+errorCode, MessageType.ERROR);
		result.include("message", message);
		result.redirectTo(HomeController.class).home(null);	
	}

…só que tenho 2 redirecionamento e com isso da erro.

Alguém poderia me orientar como resolver isso?

At,

10 Respostas

Lucas_Cavalcanti

qual é o segundo redirecionamento? o da jsp não conta, pq é um javascript.

F

ok, mas será porque da erro no redirectTo do controller

14/08/2012 11:13:52 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [default] in context with path [/siter-site] threw 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
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:96)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:89)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.util.jpa.JPATransactionInterceptor.intercept(JPATransactionInterceptor.java:51)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at com.siter.site.interceptor.GoogleKeyInterceptor.intercept(GoogleKeyInterceptor.java:34)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at com.siter.site.interceptor.LanguageInterceptor.intercept(LanguageInterceptor.java:72)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:679)
Caused by: java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed
	at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:483)
	at javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:138)
	at br.com.caelum.vraptor.http.VRaptorResponse.sendRedirect(VRaptorResponse.java:46)
	at br.com.caelum.vraptor.view.DefaultLogicResult$2.intercept(DefaultLogicResult.java:124)
	at br.com.caelum.vraptor.proxy.AbstractCglibProxifier$2.intercept(AbstractCglibProxifier.java:56)
	at com.siter.site.controller.HomeController$$EnhancerByCGLIB$$cd8affe8.home(<generated>)
	at com.siter.site.controller.ErrorController.file(ErrorController.java:53)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:616)
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
	... 52 more

isso que não estou entendendo

Lucas_Cavalcanti

se vc chama a url /erro/404 direto dá o mesmo erro?

tem algum interceptor que passa na frente desse controller? alguma classe que mexe no result ou no response?

F

se eu chamo a url/error/404 direto, faz o redirecionamento correto

Lucas_Cavalcanti

estranho…

vc não me respondeu: tem algum interceptor que passa na frente desse controller? alguma classe que mexe no result ou no response?

F

Olá,

Antes de acessar o controller, passa sim pelo interceptor

public void intercept(InterceptorStack stack, ResourceMethod method,
			Object controller) throws InterceptionException {
		
		String url = request.getRequestURL().toString().replaceAll("www.", "")
			.replaceAll("http://", "").replaceAll("https://", "");
		
		String urlWhithoutLang = url.startsWith("siter") ? url : url.substring(3);
		result.include("urlWhithoutLang", urlWhithoutLang);
		
		// default
		if (url.startsWith("siter")) {
			
			//Language language = userSession.getLanguage();
			String keyLanguage = translator.getLanguageKey();
			if (!keyLanguage.equals(Language.DEFAULT)) {
				url = "http://" + keyLanguage + "." + url;
				result.redirectTo(url);
			}
			
		// language explicit
		} else {
			
			String keyLanguage = url.substring(0, 2);
			try {
				languageController.changeLanguage(keyLanguage);
			} catch (Exception e) {
				languageController.changeLanguage(Language.DEFAULT);
			}
			
			if (keyLanguage.equals(Language.DEFAULT)) {
				url = "http://" + url.substring(3);
				result.redirectTo(url);
			}
			
		}
		stack.next(method, controller);
	}
Lucas_Cavalcanti

se passar por algum dos redirects não pode chamar o stack.next()… muda isso no código que deve funcionar.

F

não sei como fazer.
meu conhecimentos em java não são avançadas
esse código foi outra pessoa que fez, e estou tentando resolver esse problema.

Lucas_Cavalcanti

jeito simples: coloque um return; após cada result.redirectTo

F

Lucas, quero lhe agradecer pela ajuda, deu tudo certo.

Obrigado.

Criado 14 de agosto de 2012
Ultima resposta 14 de ago. de 2012
Respostas 10
Participantes 2