Enviar lista do jsp para java utilizando vraptor

11 respostas
V

Boa tarde gente, estou com o seguinte problema:

Tenho no meu jsp um select que é populado com vários options com os valores que preciso, só que tenho que passar esses valores em forma de lista via Ajax para o Vraptor para poder executar minha Logic. Gostaria de saber como faço tal conversão ou qual convenção utilizo para passar esses dados em forma de lista da minha view para o java utilizando o vraptor. Atualmente utilizo o framework jquery para facilitar com a parte de JavaScript.
Segue um fragmento do código.

Controller

@Path("/userList")
	public void setListUser(List<String> userList){
		user.getMonitoredUsers().addAll(userList);
		result.use(nothing());
	}

11 Respostas

Lucas_Cavalcanti

se vc estiver passando via parâmetros de requisição, basta colocar o nome do parâmetro do método. No caso desse método seria:

userList[0] = Joao
userList[1] = Maria
userList[2] = Pedro

etc…

se vc quiser receber uma lista de objetos, tb funciona, mas vc tem que usar pontos pra navegar nos getters e setters:

public void setListUser(List<User> users) {
   //...
}

receberia os parâmetros do tipo:

users[0].name = Joao
users[0].login = joao
users[1].name = Maria

etc

mais informações sobre isso nesse capítulo da documentação http://vraptor.caelum.com.br/documentacao/resources-rest/

V

Cara valeu, estava empacado aqui num projeto por conta disso.

ACDias

Olá,
estou com o mesmo problema e não consegui implementar isto.

Estou fazendo uma requisição ajax e mandando os dados via post mas os dados não são passados no parâmetro.

var test = new Array(); test[0] = 'teste1'; test[1] = 'teste2'; test[2] = 'teste3'; $.post('/BackOffice/generic/teste', {'test': test}, function(data){alert(data);}, 'json');

No meu controller coloquei assim:

public void teste(List&lt;String&gt; test) { result.use(json()).from(test.toArray()).serialize(); }

Tentei mandar o parametro com o nome de test e testList, mas nenhum funcionou.

Obrigado.

V

Também estou com o mesmo problema, idêntico ao post acima, alguém tem alguma idéia de como fazer?

G

ACDias, qual o erro que dá? O que é impresso no alert? Algum stacktrace?

viniciodf, no seu caso, qual a mensagem de erro? Algo é impresso?

ACDias

Eu recebo um NullPointerException porque nada é passado como parâmetro para a action. Não tem alert porque ocorre erro na requisição.
Como o VRaptor associa os parâmetros da action com os do request? Pelo nome?

br.com.caelum.vraptor.InterceptionException: java.lang.NullPointerException at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:76) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:72) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42) at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:45) at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:62) at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91) at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55) at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88) 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:175) 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:263) at org.apache.coyote.http11.Http11NioProcessor.process(Http11NioProcessor.java:887) at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:696) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:2009) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) at java.lang.Thread.run(Thread.java:619) Caused by: java.lang.NullPointerException at br.com.cedro.controllers.GenericController.teste(GenericController.java:59) 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:50) ... 42 more

G

Sim. O nome do parametro que você está enviando é injetado no parametro do método conforme o nome.

ACDias

Então o que poderia estar errado?
Eu não posso passar uma simples lista de strings?
Eu tentei passar seguindo a mesma convenção do VRaptor (adicionando o “list” ao final do nome) e não funcionou. Tentei com o mesmo nome e também não funcionou.

ACDias

Tentei com um array e funcionou. O VRaptor não tem suporte a listas para estes casos?

G

Tem sim suporte a injetar listas. Eu uso assim, porém com campos de formulário e não via javascript. Estou um pouco desconfortável sobre como o jquery está enviando os dados. Eu tenho a impressão que ele não está mandando como deveria.

O correto é ele mandar um querystring como test[0]=teste0&test[1]=teste1, mas acho que ele esta enviando como test[0]=teste0,test[1]=teste1 (que é o resultado de um Array.toString no javascript. Detalhe: isso é um padrão do envio de parametros no querystring, e não limitação no vraptor.

Faça um teste e tente enviar como test[0]=teste0&test[1]=teste1 e veja se resolve. Caso sim já sabemos onde é o erro.

var test = 'test[0]=teste1&test[1]=teste2&test[2]=teste3' $.post('/BackOffice/generic/teste', {'test': test}, function(data){alert(data);}, 'json');

Leandro-SP

Também estou com o mesmo problema.

Mas a dúvida é… e quando o meu controller está esperando um objeto do tipo Usuario… como “montar” o objeto “Usuario” a patir de dados de um formulario no jsp e enviar via ajax post para o controler?

@Path("/usuario") public void adiciona(Usuario usuario) { if (dao.existeUsuario(usuario)) { validator.add(new ValidationMessage("Login já existe", "usuario.login")); } validator.onErrorUse(page()).of(UsuarioController.class).novo(); dao.adiciona(usuario); result.redirectTo(UsuarioController.class).lista(); }

Criado 8 de janeiro de 2010
Ultima resposta 14 de ago. de 2010
Respostas 11
Participantes 5