VRaptor 3 erro no parâmetro dependendo do computador e navegador

2 respostas
carlos.lino87

Olá, essa é minha primeira postagem. Geralmente eu busco informaçoes no forum, mas não encontrei nada parecido.
Meu problema é o seguinte. eu tenho um sistema em que eu aplico um questionário.
Eu uso o jquery para carregar uma página com uma pergunta usando o $.load().

Quando a página carrega eu carrego a primeira questão

$("#divQuestao1").load("/nemda2/questoes/buscar/${idQuestionario}/1",function(){
 			$("#ordem1").fadeIn();
 		});

E quando a pessoa responde e clica em avançar, eu carrego a segunda. Quando ele volta e avança, a questão já está carregada, ou seja, só carrega uma vez.

$("#divQuestao"+ordemQuestao).load("/nemda2/questoes/buscar/"+idQuestionario+"/"+ordemQuestao, function(){
	aviso("Sucesso", "Proxima pergunta");
});

Meu controller é esse:

@Path("questoes/buscar/{id}/{ordem}")
	public void buscar(int id, int ordem) {
		questionario = questionarioDao.get(id);
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("questionario", questionario);
		params.put("ordem", ordem);
		List<Questoes> questoesList = questoesDao.listarWhereCollection(params);
		Questoes questao = questoesList.iterator().next();
		QuestoesModelo modelo;
		
		
		
		try {
			modelo = (QuestoesModelo) Class.forName("br.com.nemda.questoes."	+ tipoDao.get(questao.getTipoDeQuestoes().getId()).getNome()).newInstance();
			List<Respostas> respostas = new ArrayList<Respostas>();
			respostas.addAll(questao.getRespostases());
			modelo.init(questao, questao.getQuestionario(), respostas);

			Collections.sort(respostas, new RespostasIdComparator());
			result.include("respostas", respostas);
			
			result.include("questao", modelo);
			
			if(modelo instanceof MistaMultipla)
				result.redirectTo(this).mistaMultipla(modelo);
			
			if(modelo instanceof MistaSimples)
				result.redirectTo(this).mistaSimples(modelo);
			
			if(modelo instanceof Multipla)
				result.redirectTo(this).multipla(modelo);
			
			if(modelo instanceof Numero)
				result.redirectTo(this).numero(modelo);
			
			if(modelo instanceof Quadro)
				result.redirectTo(this).quadro(questoesList);
			
			if(modelo instanceof Simples)
				result.redirectTo(this).simples(modelo);
			
			if(modelo instanceof Texto)
				result.redirectTo(this).texto(modelo);
			
			if(modelo instanceof TextoMultiplo)
				result.redirectTo(this).textoMultiplo(modelo);

		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}


public void mistaSimples(QuestoesModelo modelo) {
//		MistaSimples questao = (MistaSimples) modelo;
		
	}

Dependendo do tipo da questão, eu redireciono pra página que monta ela, e então o jquery inclui na div.

Na máquina que eu desenvolvo está tudo normal, porem em outra máquina que fui testar, carrega a primeira questão, mas ao chamar a segunda, dá uma Exception.
Vou colocar o log que funciona na minha máquina e depois o log de quando ocorre o erro:

12:02:49,370 DEBUG [VRaptor             ] VRaptor received a new request
12:02:49,374 DEBUG [DefaultRequestExecution] executing stack  DefaultRequestExecution
12:02:49,400 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
12:02:49,401 DEBUG [DefaultResourceTranslator] trying to access /questoes/buscar/1/2
12:02:49,403 DEBUG [VRaptorRequest      ] Setting id with [1]
12:02:49,403 DEBUG [VRaptorRequest      ] Setting ordem with [2]
12:02:49,404 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: QuestoesController.buscarQuestoesController.buscar(int, int)]
12:02:49,408 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor
12:02:49,409 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InterceptorListPriorToExecutionExtractor
12:02:49,415 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor HibernateTransactionInterceptor
12:02:49,419 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor MenuInterceptor
12:02:49,421 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor LoginInterceptor
12:02:49,423 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InstantiateInterceptor
12:02:49,449 DEBUG [LazyInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor
12:02:49,450 DEBUG [OgnlParametersProvider] Applying id with [1]
12:02:49,468 DEBUG [OgnlParametersProvider] Applying ordem with [2]
12:02:49,469 DEBUG [OgnlParametersProvider] Applying _ with [1302879769358]
12:02:49,470 DEBUG [OgnlParametersProvider] cant find property for expression _ ignoring
12:02:49,470 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for QuestoesController.buscar(int, int) as [id, ordem]
12:02:49,471 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: QuestoesController.buscarQuestoesController.buscar(int, int)] are [1, 2]
12:02:49,474 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor
12:02:49,476 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
12:02:49,477 DEBUG [ExecuteMethodInterceptor] Invoking QuestoesController.buscar(int, int)
Hibernate: select questionar0_.id as id13_0_, questionar0_.ativo as ativo13_0_, questionar0_.id_cliente as id7_13_0_, questionar0_.descricao as descricao13_0_, questionar0_.ip as ip13_0_, questionar0_.nome as nome13_0_, questionar0_.id_pesquisa as id8_13_0_, questionar0_.usuario as usuario13_0_ from mdapesqu_nemda2.questionario questionar0_ where questionar0_.id=?
Hibernate: select this_.id as id28_0_, this_.descricao as descricao28_0_, this_.max_respostas as max3_28_0_, this_.nome as nome28_0_, this_.ordem as ordem28_0_, this_.id_questionario as id6_28_0_, this_.id_tipo as id7_28_0_ from mdapesqu_nemda2.questoes this_ where this_.ordem=? and this_.id_questionario=?
Hibernate: select tipodeques0_.id as id15_0_, tipodeques0_.nome as nome15_0_, tipodeques0_.quantidades_respostas as quantida3_15_0_, tipodeques0_.resposta_inteira as resposta4_15_0_ from mdapesqu_nemda2.tipo_de_questoes tipodeques0_ where tipodeques0_.id=?
Hibernate: select respostase0_.id_questao as id5_1_, respostase0_.id as id1_, respostase0_.id as id29_0_, respostase0_.descricao as descricao29_0_, respostase0_.id_entrevista as id4_29_0_, respostase0_.id_aberto as id3_29_0_, respostase0_.id_questao as id5_29_0_ from mdapesqu_nemda2.respostas respostase0_ where respostase0_.id_questao=?
12:02:49,505 DEBUG [DefaultLogicResult  ] redirecting to class QuestoesController
12:02:49,507 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for QuestoesController.simples(QuestoesModelo) as [modelo]
12:02:49,507 DEBUG [DefaultLogicResult  ] redirecting to /nemda2/questoes/simples
12:02:49,509 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ForwardToDefaultViewInterceptor
12:02:49,509 DEBUG [ForwardToDefaultViewInterceptor] Request already dispatched and commited somewhere else, not forwarding.
12:02:49,514 DEBUG [VRaptor             ] VRaptor ended the request

Agora com o erro:

11:48:17,205 DEBUG [VRaptor             ] VRaptor received a new request
11:48:17,208 DEBUG [DefaultRequestExecution] executing stack  DefaultRequestExecution
11:48:17,238 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
11:48:17,239 DEBUG [DefaultResourceTranslator] trying to access /questoes/buscar/1/2
11:48:17,245 DEBUG [VRaptorRequest      ] Setting id with [1]
11:48:17,246 DEBUG [VRaptorRequest      ] Setting ordem with [2]
11:48:17,246 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: QuestoesController.buscarQuestoesController.buscar(int, int)]
11:48:17,249 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor
11:48:17,251 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InterceptorListPriorToExecutionExtractor
11:48:17,254 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor HibernateTransactionInterceptor
11:48:17,259 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor MenuInterceptor
11:48:40,705 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor LoginInterceptor
11:48:42,803 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InstantiateInterceptor
11:48:43,352 DEBUG [LazyInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor
11:48:43,353 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: QuestoesController.buscarQuestoesController.buscar(int, int)] are [br.com.nemda.questoes.Simples@f84033]
11:48:43,425 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor
11:48:43,485 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
11:48:43,487 DEBUG [ExecuteMethodInterceptor] Invoking QuestoesController.buscar(int, int)
11:48:54,250 DEBUG [DefaultExceptionMapper] find for exception class java.lang.IllegalArgumentException

Pelo que eu entendi, o vraptor está passando o parâmetro [br.com.nemda.questoes.Simples@f84033] quando deveria ser [1, 2].

Não sei porque isso ocorre em um computador e em outro não. Testei no meu notebook e funcionou.

Eu uso 2 interceptadores, um que cria um menu, e outro de login, mas não sei se infuencia em algo.

Alguem tem alguma idéia do que pode ser?

2 Respostas

carlos.lino87

Pessoal, acho que corrigi.

Substitui o

result.redirectTo(this).mistaMultipla(modelo);

por

result.forwardTo(this).mistaMultipla(modelo);

Não sei porque, mas agora vou passando para as questões, e os parâmetros estão corretos:

9,050 DEBUG [VRaptor             ] VRaptor received a new request
12:49:29,053 DEBUG [DefaultRequestExecution] executing stack  DefaultRequestExecution
12:49:29,070 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
12:49:29,071 DEBUG [DefaultResourceTranslator] trying to access /questoes/buscar/1/4
12:49:29,072 DEBUG [VRaptorRequest      ] Setting id with [1]
12:49:29,073 DEBUG [VRaptorRequest      ] Setting ordem with [4]
12:49:29,073 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: QuestoesController.buscarQuestoesController.buscar(int, int)]
12:49:29,081 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor
12:49:29,082 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InterceptorListPriorToExecutionExtractor
12:49:29,085 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor HibernateTransactionInterceptor
12:49:29,088 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor MenuInterceptor
12:49:29,090 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor LoginInterceptor
12:49:29,106 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InstantiateInterceptor
12:49:29,123 DEBUG [LazyInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor
12:49:29,123 DEBUG [OgnlParametersProvider] Applying id with [1]
12:49:29,124 DEBUG [OgnlParametersProvider] Applying ordem with [4]
12:49:29,125 DEBUG [OgnlParametersProvider] Applying _ with [1302882549143]
12:49:29,126 DEBUG [OgnlParametersProvider] cant find property for expression _ ignoring
12:49:29,126 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for QuestoesController.buscar(int, int) as [id, ordem]
12:49:29,126 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: QuestoesController.buscarQuestoesController.buscar(int, int)] are [1, 4]
12:49:29,129 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor
12:49:29,131 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
12:49:29,131 DEBUG [ExecuteMethodInterceptor] Invoking QuestoesController.buscar(int, int)
Hibernate: select questionar0_.id as id13_0_, questionar0_.ativo as ativo13_0_, questionar0_.id_cliente as id7_13_0_, questionar0_.descricao as descricao13_0_, questionar0_.ip as ip13_0_, questionar0_.nome as nome13_0_, questionar0_.id_pesquisa as id8_13_0_, questionar0_.usuario as usuario13_0_ from mdapesqu_nemda2.questionario questionar0_ where questionar0_.id=?
Hibernate: select this_.id as id28_0_, this_.descricao as descricao28_0_, this_.max_respostas as max3_28_0_, this_.nome as nome28_0_, this_.ordem as ordem28_0_, this_.id_questionario as id6_28_0_, this_.id_tipo as id7_28_0_ from mdapesqu_nemda2.questoes this_ where this_.ordem=? and this_.id_questionario=?
Hibernate: select tipodeques0_.id as id15_0_, tipodeques0_.nome as nome15_0_, tipodeques0_.quantidades_respostas as quantida3_15_0_, tipodeques0_.resposta_inteira as resposta4_15_0_ from mdapesqu_nemda2.tipo_de_questoes tipodeques0_ where tipodeques0_.id=?
Hibernate: select respostase0_.id_questao as id5_1_, respostase0_.id as id1_, respostase0_.id as id29_0_, respostase0_.descricao as descricao29_0_, respostase0_.id_entrevista as id4_29_0_, respostase0_.id_aberto as id3_29_0_, respostase0_.id_questao as id5_29_0_ from mdapesqu_nemda2.respostas respostase0_ where respostase0_.id_questao=?
12:49:29,147 DEBUG [DefaultLogicResult  ] Executing QuestoesController.mistaSimples(QuestoesModelo)
12:49:29,147 DEBUG [DefaultLogicResult  ] Forwarding to /WEB-INF/jsp/questoes/mistaSimples.jsp
12:49:29,148 DEBUG [DefaultStaticContentHandler] Deferring request to container: /nemda2/WEB-INF/jsp/questoes/mistaSimples.jsp 
12:49:29,178 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ForwardToDefaultViewInterceptor
12:49:29,179 DEBUG [ForwardToDefaultViewInterceptor] Request already dispatched and commited somewhere else, not forwarding.
12:49:29,183 DEBUG [VRaptor             ] VRaptor ended the request

Acho que está resolvido, mas não entendi o porque. Se alguem souber o motivo me explique por favor.

Lucas_Cavalcanti

o motivo é que qdo vc fez o redirect ele deve ter caído em outra lógica…

por exemplo se vc tiver duas lógicas:

@Path("/buscar/")
public void buscar(int a, int b) {...}

@Path("/buscar/{modelo.nome}")
public void mistaSimples(Modelo modelo) {...}

qdo vc faz o redirectTo, o VRaptor preenche a url com o nome do modelo. Daí se o nome do modelo for vazio, ele vai gerar a url “/buscar”, que cai no outro método, que recebe outros argumentos, e por isso dá pau.

Criado 15 de abril de 2011
Ultima resposta 15 de abr. de 2011
Respostas 2
Participantes 2