Problema com instanciação de objeto com iogi

Bom como disse no post anterior atualize um projeto para a versao 3.5.1 e mudei para o iogi estou com um comportamento estranho que quebrou todo meu sistema .

tenho um controlador com a seguinte assinatura

public void reload(Atendido atendido,Modulo modulo,Caso caso) {

}

na jsp eu faço a chamada desse tipo

/atendimentoInicial/reload?atendido.id=2252&modulo=ATENDIMENTO_INICIAL

quando chega no controlador ele instancia tambem o parametro caso , sendo que nem enviei nada para ele instanciar. Esse parametro não deveria ser null ?

Segue log abaixo , não sei da onde ele ta tirando que envie algum parametro com o nome de “caso”

15:48:24,377 DEBUG VRaptor:81 - VRaptor received a new request
15:48:24,377 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor ResourceLookupInterceptor
15:48:24,378 DEBUG DefaultResourceTranslator:51 - trying to access /atendimentoInicial/reload
15:48:24,395 DEBUG DefaultResourceTranslator:61 - found resource [DefaultResourceMethod: AtendimentoInicialController.reloadAtendimentoInicialController.reload(Atendido, Modulo, Caso)]
15:48:24,396 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor HibernateTransactionInterceptor
15:48:24,396 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor NoCacheInterceptor
15:48:24,397 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor EnvironmentInterceptor
15:48:24,397 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor ExceptionHandlerInterceptor
15:48:24,397 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor InstantiateInterceptor
15:48:24,409 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor FlashInterceptor
15:48:24,409 DEBUG IogiParametersProvider:56 - IogiParametersProvider is up
15:48:24,410 DEBUG LazyInterceptorHandler:58 - Invoking interceptor ParametersInstantiatorInterceptor
15:48:24,410 DEBUG ParanamerNameProvider:51 - Found parameter names with paranamer for AtendimentoInicialController.reload(Atendido, Modulo, Caso) as [atendido, modulo, caso]
15:48:24,410 DEBUG JstlLocalization:83 - couldn't find message bundle, creating an empty one
15:48:24,410 DEBUG ParanamerNameProvider:51 - Found parameter names with paranamer for AtendimentoInicialController.reload(Atendido, Modulo, Caso) as [atendido, modulo, caso]
15:48:24,411 DEBUG IogiParametersProvider:69 - getParametersFor() called with parameters Parameters(Parameter(atendido.id -> 2252), Parameter(modulo -> ATENDIMENTO_INICIAL)) and targets [Target(name=atendido, type=class br.gov.sp.defensoria.sia.model.Atendido), Target(name=modulo, type=class br.gov.sp.defensoria.sia.hard.code.Modulo), Target(name=caso, type=class br.gov.sp.defensoria.sia.model.Caso)].
15:48:24,411 DEBUG ParanamerNameProvider:51 - Found parameter names with paranamer for Atendido() as []
15:48:24,412 DEBUG ParanamerNameProvider:51 - Found parameter names with paranamer for Caso() as []
15:48:24,413 DEBUG ParametersInstantiatorInterceptor:93 - Parameter values for [DefaultResourceMethod: AtendimentoInicialController.reloadAtendimentoInicialController.reload(Atendido, Modulo, Caso)] are [br.gov.sp.defensoria.sia.model.Atendido@1abcd898, ATENDIMENTO_INICIAL, br.gov.sp.defensoria.sia.model.Caso@642ff0de]
15:48:24,413 DEBUG LazyInterceptorHandler:58 - Invoking interceptor AuthenticationInterceptor
15:48:24,413 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor ExecuteMethodInterceptor
15:48:24,413 DEBUG ExecuteMethodInterceptor:60 - Invoking AtendimentoInicialController.reload(Atendido, Modulo, Caso)

Isso é um bug ?

vc usava o IOGI no 3.4.1? ou seja, esse comportamento mudou só mudando a versão do VRaptor pra 3.5.1?

Não estava usando o ognl quando atualizei pro 3.5.1 aproveitei e mudei pro iogi pra utilizar o suporte a Set pois pelo que vi o ognl não da suporte a Set certo ? Ou seja do ognl pro iogi mudou o comportamento que te falei . Mas ao meu ver não tem sentido o iogi instanciar um objeto em que não passei parametro nenhum . Algum teste que eu possa fazer pra te ajudar ?

Tem razão… Quer ajudar a corrigir e mandar um pull request para o VRaptor? =)

Ok faço um fork lá pra tentar ajudar nisso em todo caso vou abrir uma issue . Preciso disso meio urgente . Pra me ajudar me da o caminho das pedras ae , qual classe ou conjunto de classes que fazem a populacao dos parametros ? O github parece q ta meio zicado a interface

primeiro, crie um teste nessa classe:

que receba dois objetos no método do “controller”, e passando parâmetros só de um deles… daí vc verifica que o segundo ficou null

Daí se o teste falhar me dá um toque que a gente continua =)

se estiver difícil fazer o teste dá um toque que eu te ajudo =)

[quote=Lucas Cavalcanti]primeiro, crie um teste nessa classe:

que receba dois objetos no método do “controller”, e passando parâmetros só de um deles… daí vc verifica que o segundo ficou null

Daí se o teste falhar me dá um toque que a gente continua =)

se estiver difícil fazer o teste dá um toque que eu te ajudo =)[/quote]

Lucas tentei entender como funciona o esquema de teste , mas to levando uma surra aqui . O problema é no iogi acho nem é no vraptor , ate encontrei o fonte do iogi só que a modificacao que fiz até funciona só quebra a maioria dos testes do iogi , entao acho que devo ter feito algo muito errado o negocio é meio sério acho pra eu tentar resolver , creio que voce consiga resolver mais rapidamente . Todo caso deixei uma issue aberta sobre o problema . https://github.com/caelum/vraptor/issues/525

acho que dá pra fazer isso no VRaptor sim… mas seria bom ter um teste disso do lado do VRaptor mesmo, afinal a lógica é dele.

Não desista de fazer o teste, vc vai aprender bastante coisa tentando fazê-lo. Tenta copiar um teste que seja parecido…

qualquer dúvida dá um toque.

[quote=Lucas Cavalcanti]acho que dá pra fazer isso no VRaptor sim… mas seria bom ter um teste disso do lado do VRaptor mesmo, afinal a lógica é dele.

Não desista de fazer o teste, vc vai aprender bastante coisa tentando fazê-lo. Tenta copiar um teste que seja parecido…

qualquer dúvida dá um toque.[/quote]

Bom vamo la entao . Ve se to no caminho certo . Na classe ParametersProviderTest criei os seguinte modificações.

protected ResourceMethod mixed;

mixed       = method("mixed", House.class,ABC.class);

protected static class MyResource {
       void mixed(House house,ABC abc) {
        }
}

ai no meu teste

  @Test
	    public void returnsNullObjectWhenThereAreNoParameters() throws Exception {
	    	requestParameterIs(mixed, "abc.x", "1");
	    	
	    	House house = getParameters(mixed);
	    	assertThat(house, is(nullValue()));
	    }

Só que fico tomando um ArrayIndexOutOfBoundsException

java.lang.ArrayIndexOutOfBoundsException: 1
	at br.com.caelum.vraptor.http.iogi.IogiParametersProvider.createTargets(IogiParametersProvider.java:94)
	at br.com.caelum.vraptor.http.iogi.IogiParametersProvider.getParametersFor(IogiParametersProvider.java:61)
	at br.com.caelum.vraptor.http.ParametersProviderTest.getParameters(ParametersProviderTest.java:410)
	at br.com.caelum.vraptor.http.ParametersProviderTest.returnsNullObjectWhenThereAreNoParameters(ParametersProviderTest.java:115)
	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 org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:69)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:48)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:292)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Pelo que entendi o metodo

private List<Target<Object>> createTargets(ResourceMethod method) {
		Method javaMethod = method.getMethod();
		List<Target<Object>> targets = new ArrayList<Target<Object>>();

		Type[] parameterTypes = javaMethod.getGenericParameterTypes();
		String[] parameterNames = nameProvider.parameterNamesFor(javaMethod);
		for (int i = 0; i < methodArity(javaMethod); i++) {
			if (parameterTypes[i] instanceof TypeVariable) {
				ParameterizedType superclass = (ParameterizedType) method.getResource().getType().getGenericSuperclass();
				parameterTypes[i] = superclass.getActualTypeArguments()[0];
			}
			Target<Object> newTarget = new Target<Object>(parameterTypes[i], parameterNames[i]);
			targets.add(newTarget);
		}

		return targets;
	}

Espera o numero de parametros sempre igual a assinatura do metodo , mas no teste eu so passo 1 parametro e minha assinatura espera dois . Teria que corrigir pra dar suporte a isso ? Ou nao tem nada a ver o que to fazendo ?

Tá no github? se não, põe lá no seu fork e me manda o link pra eu comentar por lá =)

https://github.com/jlemes/vraptor/tree/iogi-parameters-issue criei um branch lá da uma olhada