VRatpor 3.1.0 enviar array da view para controller utilizando vraptor

Já havia postado em outro tópico um problema relacionado ao enviar uma lista do JSP para meu Controller utilizando o vraptor. O problema foi resolvido passando um array da view e convertendo para list no meu controller. Até ai tudo bem, funcionou corretamente, só que agora quando envio apenas um elemento no meu array o vraptor gera algumas exceções, já enviado dois ou mais elementos funciona corretamente.
Gostaria de saber se é um bug do vraptor não conseguir enviar apenas um elemento no meu array

Segue o código do meu controller:


	@Path("/userList")
	public void setListUser(String[] userList){
		user.getMonitoredUsers().addAll(Arrays.asList(userList));
		result.use(nothing());
	}
	

Segue o código da minha view que envia o array de elementos.


			function monitore(){
				var userList = new Array();
				$('#box2View option').each(function(i, option){
					var optText = $(this).text();
					userList[i] = optText;
					var id='MON_USER_'+optText.replace(/ /g, '_');
					$("#connectedUsers tr>td:nth-child(1)").each(function(j){
						if($(this).text() == optText){
							var name = optText;
							var date = $('#connectedUsers tr:nth-child(' + j + ')>td:nth-child(3)').text();
							var html;
							html = '<tr id="' + id + '">';
							html += '<td class="center"><img src="img/ok.gif" alt="status"/></td>';
							html += '<td class="center">' + name + '</td>';
							html += '<td class="center">Online</td>';
							html += '<td class="center">' + date + '</td>';
							html += '</tr>'; 	
							$('#monitoredUsers tbody').html(html);
							$(option).remove();
							return false;
						}
					});
					
				});
				$.post('${pageContext.request.contextPath}/userList',{'userList': userList}, function(data){
				}, "json");

Erro gerado ao enviar meu array com apenas um elemento


br.com.caelum.vraptor.InterceptionException: java.lang.NullPointerException
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:77)
	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:77)
	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.cedro.interceptor.UserInterceptor.intercept(UserInterceptor.java:69)
	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.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)
	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: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.Http11NioProcessor.process(Http11NioProcessor.java:883)
	at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:722)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:2214)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NullPointerException
	at java.util.Arrays$ArrayList.<init>(Arrays.java:3357)
	at java.util.Arrays.asList(Arrays.java:3343)
	at br.com.cedro.controllers.GenericController.setListUser(GenericController.java:54)
	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

No outro thread eu havia deixado uma solução que acho que você testou. É bom analisar ela.

Há dois testes para você fazer, que é saber o que está chegando no método. Para isso TEMPORARIAMENTE injete um HttpServletRequest no seu controller e faça isso:

[code]@Path("/userList")
public void setListUser(String[] userList){
System.out.println(userList);
System.out.println(request.getParameter(“userList”));

 user.getMonitoredUsers().addAll(Arrays.asList(userList));  
 result.use(nothing());  

} [/code]

E nos retorne o resultado disso.

userList está vindo nulo
acho que ele tenta mandar como uma String e não como um array.
o getParameter imprimiu uma string, q seria o primeiro valor do meu array.

O teste do outro post não funcionou. Deu nullpointerexception tambem.

viniciodf, é exatamente o que eu pensava.

Note que no seu código você cria um array e tenta usar o toString dele para enviar ao vraptor. Algo como isso:

[code]var userList = new Array();
for …
serList[i] = optText;

$.post(’${pageContext.request.contextPath}/userList’,{‘userList’: userList}, function(data){
…[/code]

Assim o jquery irá enviar uma String userList=xxxxxx, ou seja, um valor simples e não um array.

Conforme a spec do post e get voce precisa enviar algo como isso:

Tente alterar seu código para enviar algo assim. Aí você verá que funcionará.

Linha 02: var userList = '';

Linha 05: userList += 'userList[' + i + ']=' + optText + '&';

então… tem um bug no vraptor qdo vc manda um array de um único elemento…

trocar de String[] pra List não funciona?

pra funcionar os parâmetros têm que vir userList[0]=abc, userList[1]=sdfs, etc…

tente criar o userList no javascript assim:

var params = {};
for ...
   params['userList[' + i + ']'] = optText;

$.post('${pageContext.request.contextPath}/userList',params, function(data){ 
...

este é o bug, mirado para a 3.1.1:

eu estava com o mesmo problema, achei que poderia ser algum erro da minha parte, sendo assim resolvi adotando uma medida “paliativa”.
valeu por compartilhar seu problema viniciodf :smiley: