VRaptor 3 Interceptor Exception [RESOLVIDO]

32 respostas
J

Bom Dia, pessoal estou tendo o seguinte problema somente com esta URL que passa 3 argumentos alguem poderia me ajudar o porque desta exception.

SEVERE: Servlet.service() for servlet default threw exception
br.com.caelum.vraptor.InterceptionException: java.lang.IllegalArgumentException: wrong number of arguments
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:77)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.tms.interceptor.AutorizacaoInterceptor.intercept(AutorizacaoInterceptor.java:72)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.displaytag.filter.ResponseOverrideFilter.doFilter(ResponseOverrideFilter.java:125)
	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:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Thread.java:637)
Caused by: java.lang.IllegalArgumentException: wrong number of arguments
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:57)
	... 43 more

Obrigado !!!
Joao Vitor

32 Respostas

Lavieri

não basta colar a exception… é bom tb colar o trecho de código onde ela ocorre… e se possivel, falar o que vc fez, para que ela acontecesse … por exemplo… acessei o link “tal” e ai a exception ocorreu…

mas esse erro acontece, quando o numero de argumentos de um método esta incorreto…

J

Lavieri:
não basta colar a exception… é bom tb colar o trecho de código onde ela ocorre… e se possivel, falar o que vc fez, para que ela acontecesse … por exemplo… acessei o link “tal” e ai a exception ocorreu…

mas esse erro acontece, quando o numero de argumentos de um método esta incorreto…

Segue o codigo ai

@Intercepts
public class AutorizacaoInterceptor implements Interceptor {
	private final Result result;
	private final Validator validator;
	private final LoginModule loginModule;
	private ResourceMethod method;
	
	public AutorizacaoInterceptor(Result result, Validator validator, LoginModule loginModule) {
		// TODO Auto-generated constructor stub
		this.result = result;
		this.validator = validator;
		this.loginModule = loginModule;
	}
	
	@Override
	public boolean accepts(ResourceMethod arg0) {
		// TODO Auto-generated method stub
		return true;
	}
	
	@Override
	public void intercept(InterceptorStack arg0, ResourceMethod arg1,
			Object arg2) throws InterceptionException {
		// TODO Auto-generated method stub
		
		if ((this.loginModule.isNotLogged()) && (!arg1.containsAnnotation(Liberado.class))) {
			this.result.include("errors", Arrays.asList(new ValidationMessage("usuario inválido", "user"))).use(Results.logic()).redirectTo(AdmUserController.class).login();
		} else {
			if (this.loginModule.isNotLogged()) {
				this.result.include("errors", Arrays.asList(new ValidationMessage("usuário ou senha inválida", "","error.user.invalid")));
			} else {
				this.result.include("errors", Arrays.asList(new ValidationMessage("", "","")));				
			}
                        //A exception esta ocorrendo aqui
			arg0.next(arg1, arg2);
		}
	}
}
Lavieri
J

entao quando eu mando acessar por exemplo este link
localhost:8080/test/cliente/1/2/3 ele abre uma tela para edicao edito salvo depois mando abrir o mesmo registro novamente ai exception se eu der um f5 volta a funcionar normal.

Estranho neh.

Lucas_Cavalcanti

quais são as lógicas que tão dando esse problema?

tipo, a lógica de edição, e a lógica de redirecionamento… manda o @Path mais a declaração dos métodos aqui… se possível os redirects tb…

J

Lucas Cavalcanti:
quais são as lógicas que tão dando esse problema?

tipo, a lógica de edição, e a lógica de redirecionamento… manda o @Path mais a declaração dos métodos aqui… se possível os redirects tb…

Que nem lucas fiz Sysout na logica do editar ele nem chegou a passar la ainda pelo que estou percebendo ou esta no intercept ou no router meu router esta assim

routeFor("/expordemsubitem/{expordemsubitem.id.expordemitem.id.idordem.id}/{expordemsubitem.id.expordemitem.id.id}/{expordemsubitem.id.id}").with(HttpMethod.GET).is(ExpOrdemSubItemController.class).editar(null);

Detalhe estou usando VRaptor 3.1.2-SNAP
Obrigado !!!
Joao Vitor

Lucas_Cavalcanti

algum motivo pra usar esse routeFor? anotar diretamente na lógica não é mais fácil e legível?

J

Ok vou anotar direto na logica mas estou usando GenericController

Lucas_Cavalcanti

mesmo usando generic controller, vc deveria anotar as lógicas direto…

mas deixa eu entender… no seu GenericController vc tem um método editar? No seu ExpOrdemSubItemController vc sobrescreve esse método?

J

Lucas Cavalcanti:
mesmo usando generic controller, vc deveria anotar as lógicas direto…

mas deixa eu entender… no seu GenericController vc tem um método editar? No seu ExpOrdemSubItemController vc sobrescreve esse método?

Isso mesmo exemplo

@Override
	public void editar(ExpOrdemSubItem expordemsubitem) {
		// TODO Auto-generated method stub
		super.editar(expordemsubitem);
	}
Lucas_Cavalcanti

qdo vc anota o método sobrescrito funciona?

J

fiz desta forma

@Resource
@Path("/expordemsubitem")
public class ExpOrdemSubItemController extends GenericoController<ExpOrdemSubItem> {
	
	public ExpOrdemSubItemController(Result result, Validator validator,
			DaoGenerico daoGenerico) {
		super(result, validator, daoGenerico);
		// TODO Auto-generated constructor stub
	}
	
	@Override
	@Get
	@Path("{expordemsubitem.id.expordemitem.id.idordem.id}/{expordemsubitem.id.expordemitem.id.id}/{expordemsubitem.id.id}")
	public void editar(ExpOrdemSubItem expordemsubitem) {
		// TODO Auto-generated method stub
		super.editar(expordemsubitem);
	}
	
}

e continuou tendo o mesmo problema

Lucas_Cavalcanti

como é o método editar? pelo menos a parte do result.redirect

J

Lucas mas ele nao ta nem passando ainda pelo editar

metodo do GenericoController

@Get
	public void editar(T obj) {
		// TODO Auto-generated method stub
		System.out.println("editar...");
		this.objeto = this.daoGenerico.getDao().loadObjeto(this.classe, new Mirror().on(obj).invoke().getterFor("id"));
		this.result.use(Results.logic()).forwardTo(getClass()).formulario();
	}
Lucas_Cavalcanti

troca o forwardTo por redirectTo (por questão de boa prática) e o getClass() por this.classe (se isso for a classe do controller, pq podem ter proxies envolvidos)

em qual lógica tá passando que dá esse problema então? e qual redirect está sendo problemático?

habilita o log de debug do vraptor e posta o log da requisição problemática… de preferencia em um anexo, não no corpo da mensagem

J

Lucas Cavalcanti:
troca o forwardTo por redirectTo (por questão de boa prática) e o getClass() por this.classe (se isso for a classe do controller, pq podem ter proxies envolvidos)

em qual lógica tá passando que dá esse problema então? e qual redirect está sendo problemático?

habilita o log de debug do vraptor e posta o log da requisição problemática… de preferencia em um anexo, não no corpo da mensagem

Segue ai o anexo

Lucas_Cavalcanti

como vc configurou o logger? só tá aparecendo a parte de ioc, não todos os logs do vraptor

J
log4j.rootCategory=DEBUG, stdout
log4j.logger.br.com.caelum.vraptor=DEBUG
Lucas_Cavalcanti

só pra testar, renomeie o log4j.properties pra log4j.properties-backup e crie o arquivo log4j.xml com o conteúdo:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
        
        <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
                <layout class="org.apache.log4j.PatternLayout">
                        <param name="ConversionPattern" 
                                value="%d{HH:mm:ss,SSS} %5p [%-20c{1}] %m%n"/>
                </layout>
        </appender>

        <category name="br.com.caelum.vraptor">
                <priority value="DEBUG" />
                <appender-ref ref="stdout" />
        </category>

</log4j:configuration>

e manda o log que ele gerar

J

Lucas Cavalcanti:
só pra testar, renomeie o log4j.properties pra log4j.properties-backup e crie o arquivo log4j.xml com o conteúdo:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
        
        <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
                <layout class="org.apache.log4j.PatternLayout">
                        <param name="ConversionPattern" 
                                value="%d{HH:mm:ss,SSS} %5p [%-20c{1}] %m%n"/>
                </layout>
        </appender>

        <category name="br.com.caelum.vraptor">
                <priority value="DEBUG" />
                <appender-ref ref="stdout" />
        </category>

</log4j:configuration>

e manda o log que ele gerar

Lucas nao ta gerando log algum desta forma coloquei na mesma pasta que estava meu log4j.properties renomei para log4j.propertis.old e coloquei log4j.xml

Lucas_Cavalcanti

essa pasta onde está o log4j.xml é uma source folder? ou vc fez isso direto no WEB-INF/classes?

J

/src/main/resources/log4j.xml

Lucas_Cavalcanti

tenta dar um clean no tomcat e reiniciar o servidor

J

olha lucas apaguei tomcat instalei de novo dei clean projeto inteiro e nada so funciona pelo log4j.properties nao sei pq.

Lucas_Cavalcanti

enfim, em qual lógica tá passando que dá esse problema? e qual redirect está sendo problemático?

J

olha lucas conforme expliquei no comeco da conversa /sistema/expordemsubitem/1/2/3 edito gravo hora que mando editar de novo da exception o codigo fonte eu ja postei ai tb.

ok

Obrigado !!!

Lucas_Cavalcanti

a lógica que faz o update de verdade (dao.salva, dao.atualiza ou algo do tipo), faz algum redirect? qual redirect ela faz? esse é o redirect problemático, e vc não mandou esse código… por isso q eu pedi…

[]'s

Lucas_Cavalcanti

provavelmente essa lógica q atualiza está no seu GenericController… e ela deve ter um getClass() lá no meio… dá um System.out.println() pra ver q classe é tb…
(pode ser q esteja referenciando o GenericController direto ou um proxy… e isso pode dar pau)

J

Lucas Cavalcanti:
provavelmente essa lógica q atualiza está no seu GenericController… e ela deve ter um getClass() lá no meio… dá um System.out.println() pra ver q classe é tb…
(pode ser q esteja referenciando o GenericController direto ou um proxy… e isso pode dar pau)

Olha lucas tem alguma coisa muito estranha ele nem chega dar passar no GenericController ele da no Interceptor mesmo sera que nao pau deste VRaptor-3.1.2-SNAP.

Lucas_Cavalcanti

isso não tem a ver com os interceptors… tem a ver com o jeito que o vraptor faz os redirecionamentos + o fato de vc usar herança nos controllers…

ele não chega a passar pelo generic controller pq o vraptor não consegue executar o redirecionamento…

Funciona assim:

  • vc chama um redirecionamento do tipo:

result.redirectTo(MeuController.class).minhaLogica(argumento1, argumento2)

  • o vraptor guarda o array [argumento1, argumento2] no escopo flash para usar na próxima requisição, monta a url da minhaLogica e manda um redirect pra ela
  • se a url da minhaLogica tem parâmetros, o VRaptor popula ela usando o argumento1 e o argumento2
  • na próxima requisição, o VRaptor vê se existem parâmetros no Flash e se tiver, chama a lógica passando exatamente os parâmetros…

Com o erro que vc está tendo (wrong number of arguments) o que pode estar acontecendo é o seguinte:
– ao gerar a url do redirecionamento, algum dos parâmetros é vazio:

@Path("/logica/{argumento1}/{argumento2}")

se o argumento1 é “abc” e o argumento2 é vazio, o vraptor vai redirecionar para: "/logica/abc/"
e pode ser que essa URL caia em MeuController.minhaOutraLogicaQueNaoRecebeArgumentos()… daí o vraptor tenta chamar essa outra lógica passando os 2 argumentos q estavam no flash, daí vem o wrong number of arguments…

– outra opção é vc estar redirecionando (com redirectTo) para uma lógica anotada com @Post, e existe uma lógica anotada com @Get que aceita a mesma URL, e tem um número diferente de parâmetros… os redirects só funcionam pra métodos com @Get, por causa dos browsers

se o log do vraptor estivesse funcionando aí, daria pra saber qual lógica está sendo chamada de fato, que provavelmente não é a que vc está redirecionando

Entendeu? Isso encaixa com o seu caso?

J

Lucas Cavalcanti:
isso não tem a ver com os interceptors… tem a ver com o jeito que o vraptor faz os redirecionamentos + o fato de vc usar herança nos controllers…

ele não chega a passar pelo generic controller pq o vraptor não consegue executar o redirecionamento…

Funciona assim:

  • vc chama um redirecionamento do tipo:

result.redirectTo(MeuController.class).minhaLogica(argumento1, argumento2)

  • o vraptor guarda o array [argumento1, argumento2] no escopo flash para usar na próxima requisição, monta a url da minhaLogica e manda um redirect pra ela
  • se a url da minhaLogica tem parâmetros, o VRaptor popula ela usando o argumento1 e o argumento2
  • na próxima requisição, o VRaptor vê se existem parâmetros no Flash e se tiver, chama a lógica passando exatamente os parâmetros…

Com o erro que vc está tendo (wrong number of arguments) o que pode estar acontecendo é o seguinte:
– ao gerar a url do redirecionamento, algum dos parâmetros é vazio:

@Path("/logica/{argumento1}/{argumento2}")

se o argumento1 é “abc” e o argumento2 é vazio, o vraptor vai redirecionar para: "/logica/abc/"
e pode ser que essa URL caia em MeuController.minhaOutraLogicaQueNaoRecebeArgumentos()… daí o vraptor tenta chamar essa outra lógica passando os 2 argumentos q estavam no flash, daí vem o wrong number of arguments…

– outra opção é vc estar redirecionando (com redirectTo) para uma lógica anotada com @Post, e existe uma lógica anotada com @Get que aceita a mesma URL, e tem um número diferente de parâmetros… os redirects só funcionam pra métodos com @Get, por causa dos browsers

se o log do vraptor estivesse funcionando aí, daria pra saber qual lógica está sendo chamada de fato, que provavelmente não é a que vc está redirecionando

Entendeu? Isso encaixa com o seu caso?

Entendi vou fazer alguns teste aqui e posto o resultado obrigado ai pela atencao.

J

Conforme eu lucas conversamos chegamos a uma conclusão como minha requisicoes passava por todos accepts do vraptor entao o poblema esta neste codigo aqui

Codigo Antigo

@Intercepts
public class AutorizacaoInterceptor implements Interceptor {
	private final Result result;
	private final Validator validator;
	private final LoginModule loginModule;
	
	public AutorizacaoInterceptor(Result result, Validator validator, LoginModule loginModule) {
		// TODO Auto-generated constructor stub
		this.result = result;
		this.validator = validator;
		this.loginModule = loginModule;
	}
	
	@Override
	public boolean accepts(ResourceMethod arg0) {
		// TODO Auto-generated method stub
		return true;
	}
	
	@Override
	public void intercept(InterceptorStack stack, ResourceMethod arg1,
			Object arg2) throws InterceptionException {
		
		if ((this.loginModule.isNotLogged()) && (!arg1.containsAnnotation(Liberado.class))) {
			this.result.include("errors", Arrays.asList(new ValidationMessage("usuario inválido", "user"))).use(Results.logic()).redirectTo(AdmUserController.class).login();
		} else {
			if (this.loginModule.isNotLogged()) {
				this.result.include("errors", Arrays.asList(new ValidationMessage("usuário ou senha inválida", "","error.user.invalid")));
			} else {
				//CODIGO ESTA DANDO EXCEPTION
				this.result.include("errors", Arrays.asList(new ValidationMessage("", "",""))); 
			}
			stack.next(arg1, arg2);
		}
	}
}

Codigo NOVO

@Intercepts
public class AutorizacaoInterceptor implements Interceptor {
	private final Result result;
	private final Validator validator;
	private final LoginModule loginModule;
	
	public AutorizacaoInterceptor(Result result, Validator validator, LoginModule loginModule) {
		// TODO Auto-generated constructor stub
		this.result = result;
		this.validator = validator;
		this.loginModule = loginModule;
	}
	
	@Override
	public boolean accepts(ResourceMethod arg0) {
		// TODO Auto-generated method stub
		return true;
	}
	
	@Override
	public void intercept(InterceptorStack stack, ResourceMethod arg1,
			Object arg2) throws InterceptionException {
		
		if ((this.loginModule.isNotLogged()) && (!arg1.containsAnnotation(Liberado.class))) {
			this.result.include("errors", Arrays.asList(new ValidationMessage("usuario inválido", "user"))).use(Results.logic()).redirectTo(AdmUserController.class).login();
		} else {
			if (this.loginModule.isNotLogged()) {
				this.result.include("errors", Arrays.asList(new ValidationMessage("usuário ou senha inválida", "","error.user.invalid")));
			} else {
				//CODIGO ALTERADO
				this.result.include("errors", Collections.emptyList());
			}
			stack.next(arg1, arg2);
		}
	}
}

Explicacao e o seguinte como lucas me falou:

new ValidationMessage("","","")

Os parâmetros do construtor são: mensagem, categoria, parâmetros da mensagem…
como a mensagem não recebe nenhum parâmetro, vc não pode passar o 3o argumento!

Entao e isso ai esta resolvido.

Obrigado a todos

Criado 5 de abril de 2010
Ultima resposta 6 de abr. de 2010
Respostas 32
Participantes 3