VRaptor 3 Interceptor Exception [RESOLVIDO]

[quote=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[/quote]

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

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

/src/main/resources/log4j.xml

tenta dar um clean no tomcat e reiniciar o servidor

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

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

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 !!!

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

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)

[quote=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)[/quote]

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.

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?

[quote=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?[/quote]

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

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