Erro no Iterceptor do vraptor 3[RESOLVIDO]

10 respostas
L

Estou fazendo um iterceptor simples para validar sessão, quando carrega a aplicação e o interceptor atua, gera uma exceção.
Pecebi que é na hora do redirecionamento. Tentei por lógica e por página, mas gera o mesmo erro.
podem me ajudar?

Exceção:

03/09/2009 14:15:57 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
br.com.caelum.vraptor.view.ResultException: You must call goTo method in order to specify where to go
	at br.com.caelum.vraptor.validator.DefaultValidator.validate(DefaultValidator.java:109)
	at br.com.caelum.vraptor.validator.DefaultValidator.checking(DefaultValidator.java:73)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:80)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:54)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:51)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
	at br.com.caelum.vraptor.interceptor.multipart.MultipartInterceptor.intercept(MultipartInterceptor.java:61)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
	at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:58)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
	at br.com.caelum.vraptor.core.URLParameterExtractorInterceptor.intercept(URLParameterExtractorInterceptor.java:45)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:70)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:71)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:99)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:38)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:97)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Thread.java:637)

Código do interceptor:

package br.eg.commons.util;

import java.io.IOException;
import java.util.Arrays;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import br.com.caelum.vraptor.InterceptionException;
import br.com.caelum.vraptor.Intercepts;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.core.InterceptorStack;
import br.com.caelum.vraptor.interceptor.Interceptor;
import br.com.caelum.vraptor.ioc.RequestScoped;
import br.com.caelum.vraptor.resource.ResourceMethod;
import br.com.caelum.vraptor.view.Results;

import br.eg.toolComponentFw.facade.ToolComponentFramework;
import br.eg.toolComponentFw.facade.ToolInstance;
import br.eg.tools.faq.FaqMgrController;

@RequestScoped
@Intercepts
public class AuthenticationInterceptor implements Interceptor {
	
	
	private HttpServletRequest request;
	private Result result;
	private ToolComponentFramework toolComponentFramework;
	private HttpSession session;

	public AuthenticationInterceptor(HttpSession  session, HttpServletRequest request, Result result, ToolComponentFramework toolComponentFramework) {
		this.session = session;
		this.request = request;
		this.result = result;
		this.toolComponentFramework = toolComponentFramework;
	}

	public boolean accepts(ResourceMethod method) {
		
		 return Arrays.asList(FaqMgrController.class).contains(method.getMethod().getDeclaringClass());
	}

	public void intercept(InterceptorStack stack, ResourceMethod method,Object resourceInstance) throws InterceptionException {
		
		 if (this.session.getAttribute("currentUser") == null) {
			 try {
				 
					ToolInstance mainToolInstance = toolComponentFramework.getMainTool();
					result.use(Results.page()).redirect(request.getContextPath() + "/groupware-workbench/"+mainToolInstance.getId()+"/userMgr/login");
					//response.sendRedirect(request.getContextPath() + "/groupware-workbench/"+mainToolInstance.getId()+"/userMgr/login");
			 } catch (IOException e) {
				 throw new InterceptionException(e);
			 } catch (Exception e) {
				e.printStackTrace();
			}
         } else {
             stack.next(method, resourceInstance);
         }
	}

}

código do userMgrController:

public UserMgrController(HttpSession session, HttpServletResponse response, HttpServletRequest request, Result result, ToolInstance toolInstance, Validator validator) throws Exception {
		this.result = result;
		this.toolInstance = toolInstance;
		this.userMgr = (UserMgrInstance) toolInstance.getCollabComponentInstance(UserMgrInstance.class);
		this.validator = validator;
		this.session = session;
		this.response = response;
		this.request = request;
		this.toolComponentFramework = (ToolComponentFramework)toolInstance.getToolComponent().getComponentFramework();
	}
.
.
.

	 @Get 
	 @Path("/groupware-workbench/{idToolInstance}/userMgr/login")
	 public void login() {
		 System.out.println("entrou login");
	 }
	 
	 @Post 
	 @Path("/groupware-workbench/{idToolInstance}/userMgr/doLogin")
    public void doLogin(User user) throws Exception {
		User userTmp =  this.userMgr.findByLogin(user.getLogin());
		if(userTmp != null){
			session.setAttribute("currentUser", userTmp);
			//response.sendRedirect(request.getContextPath() + "/groupware-workbench/"+toolInstance.getId()+"/");
			result.use(Results.page()).redirect("../../../");
		}else{
			result.use(Results.page()).redirect("./login");
		}
        
    }

10 Respostas

Lucas_Cavalcanti

Pelo que eu vi não tá chegando nesse interceptor… ou se chega, dá uma olhada na uri que ele tá chamando…

pelo jeito ele não conseguiu instanciar algum parâmetro da lógica… e deu erro de validação por causa disso

qual uri você tá chamando que chega nesse código?

L

Se entendi direito:
quando chama o list do faq, o interceptor é chamado, e verifica se há usuário logado, então ele redireciona para a URL(“http://localhost:8080/teste-vraptor3-groupwareworkbench/groupware-workbench/1/userMgr/login”).
nesse momento do redirecionamento dentro do interceptor é lançada a exceção.

public class FaqMgrController {

	final private FaqMgrInstance faqMgr;
	final private Result result;
	final private ToolComponentFramework toolComponentFramework;
	
	public FaqMgrController(Result result, ToolInstance toolInstance, ToolComponentFramework toolComponentFramework) throws Exception{
		this.result = result;
		this.faqMgr = (FaqMgrInstance) toolInstance;
		this.toolComponentFramework = toolComponentFramework;
	}
	
	/*
	 * This is a basic operation set:]
	 * 	list (to show items),
	 * 	save (to create and to update),
	 * 	show (to view for edit)
	 * 	remove (to delete) 
	 */
	@Get
	@Path(value="/groupware-workbench/{idToolInstance}/faq")
	public List<Faq>  list() throws Exception {
		result.include("faqMgr", faqMgr);
		result.include("groupNames", this.toolComponentFramework.getGroups());
		result.include("toolComponentFramework", this.toolComponentFramework);
		return (List<Faq>) this.faqMgr.findAll();
	}
.
.
.
Guilherme_Silveira

Parece que algum dos parametros que voce esta passando esta com erro de conversao. Por exemplo o campo eh int e vc esta passando uma string. Quais os parametros e qual o modelo que vc esta usando?

A mensagem de erro deveria ser mais educada, claro. O Sergio Lopes esta trabalhando nesse bug.

wariows

Guilherme Silveira:
Parece que algum dos parametros que voce esta passando esta com erro de conversao. Por exemplo o campo eh int e vc esta passando uma string. Quais os parametros e qual o modelo que vc esta usando?

A mensagem de erro deveria ser mais educada, claro. O Sergio Lopes esta trabalhando nesse bug.

Ele está requisitando um parâmetro pelo @Path e não está colocando o parametro no método:

ninguém tá recebendo {idToolInstance}, será que é isso?

O certo seria:

@Post @Path("/groupware-workbench/{idToolInstance}/userMgr/doLogin") public void doLogin(User user, Integer idToolInstance) throws Exception { ...

Não sei de onde vem esse ‘User’ tb…

L

O User vem do form da tela de login, ao fazer submit, ele chama o método doLogin(User user), mas ele nem chega ar ir para o método login().
Quando o interceptor redireciona para a tela de login, chamando o métod login() do userMgrController, ele gera a exceção na chamada do redirecionamento.
Muito obrigado por estarem me ajudando. Vou tentar essas dicas que vocês sugeriram.

Paulo_Silveira

oi lucas
de o feedback assim que testar!
abracos

wariows

lucasant:
O User vem do form da tela de login, ao fazer submit, ele chama o método doLogin(User user), mas ele nem chega ar ir para o método login().
Quando o interceptor redireciona para a tela de login, chamando o métod login() do userMgrController, ele gera a exceção na chamada do redirecionamento.
Muito obrigado por estarem me ajudando. Vou tentar essas dicas que vocês sugeriram.

@Get @Path("/groupware-workbench/{idToolInstance}/userMgr/login") public void login() { System.out.println("entrou login"); }

Mesmo problema cara, vc precisa receber os parametros que especificou no path no método. tem que ficar assim:

@Get @Path("/groupware-workbench/{idToolInstance}/userMgr/login") public void login(Integer idToolInstance) { System.out.println("entrou login"); }

galmeida

Não sei se ajuda ou atrapalha: eu recebi a mesma exception (You must call goTo method in order to specify where to go) quando usei a validação no estilo clássico sem chamar [color=darkblue]validator.onError().goTo(FuncionarioController.class).formulario();[/color]

L

Resolvido.
Com a ajuda do meu chará Lucas da Caelum, vimos que é um bug do vraptor 3 que eles consertarão.
O problema é que na chamada da URL ele teria que chamar o login, por algum motivo ele casa com o padrão do método delete, esperando o parâmetro User.
Por isso ocorre o erro.
Colocando prioridades no @Path dos métodos, o problema foi resolvido.
:smiley:
obrigado a todos que tentaram me ajudar!!!

@Delete
	@Path(value="/groupware-workbench/{idToolInstance}/userMgr/{user.id}", priority=2) 
	public void delete(User user) throws Exception{
		this.userMgr.delete(user.getId());
		//result.use(Results.logic()).redirectTo(UserMgrController.class).list();
		result.use(Results.page()).redirect("../userMgr");
	}
	
	
	 @Get 
	 @Path(value="/groupware-workbench/{idToolInstance}/userMgr/login", priority=0)
	 public void login() {
		 System.out.println("entrou login");
	 }
	 
	 @Post 
	 @Path(value="/groupware-workbench/{idToolInstance}/userMgr/doLogin", priority = 1)
    public void doLogin(User user) throws Exception {
		User userTmp =  this.userMgr.findByLogin(user.getLogin());
		if(userTmp != null){
			session.setAttribute("currentUser", userTmp);
			//response.sendRedirect(request.getContextPath() + "/groupware-workbench/"+toolInstance.getId()+"/");
			result.use(Results.page()).redirect("../../../");
		}else{
			result.use(Results.page()).redirect("./login");
		}
Guilherme_Silveira

@Path(value="/groupware-workbench/{idToolInstance}/userMgr/{user.id}", priority=2) @Path(value="/groupware-workbench/{idToolInstance}/userMgr/login", priority=0)
Repara que nao eh bem um bug. Se voce nao usa as prioridades, teoricamente nao da para saber se userMgr/login eh para fazer match com a url de baixo ou a decima.
O Lucas se referiu a implementacao de suporte a deteccao por tipo. Se user.id e’ do tipo int, ele vai percebe que login nao e’ int, entao nao e’ para ir para essa url. Apesar de resolver alguns problemas, somente o uso de prioridade vai servir. O caso a seguir eh um exemplo que nao resolveria sem prioridade:

@Path(value="/groupware-workbench/{idToolInstance}/userMgr/{user.name}")  
    @Path(value="/groupware-workbench/{idToolInstance}/userMgr/login")
Criado 3 de setembro de 2009
Ultima resposta 4 de set. de 2009
Respostas 10
Participantes 6