Re:Input ChekBox null + VRaptor 3 + Apache Tomcat [RESOLVIDO]

11 respostas
Tenkara_Kiddo

Olá galera como vão ?
bom meu problema é o seguinte eu criei uma jsp e um modelo para fazer o controle de permissoes por usuario
na minha jsp que recebe quais telas cada funcionario tem acesso eu tenho uma lista de checkboxes que deveriam retornar quais telas estão disponiveis para o meu controller
porém essas checkboxes estão retornando valor null estou anexando o codigo da minha jsp e do meu controller

formulario.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Editar Permissões</title>
</head>
<body>
	<form action="<c:url value="/permissao/${analista.id }"/>" method="post">
		<fieldset>
			<legend>Editar permissões para o usuário - ${analista.nome_analista }</legend>
			
			<c:forEach items="${funcionalidadeList}" var="funcionalidades">
				<input type="checkbox" name="permissoes" value="${funcionalidades.id}"/> ${funcionalidades.nome_tela } <br/> 
			</c:forEach>
			
			<button type="submit">Enviar</button>
			
		</fieldset>		
	</form>
</body>
</html>

PermissaoController.class

package br.com.webcommerce.controller;

import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.webcommerce.dao.AnalistaDao;
import br.com.webcommerce.dao.FuncionalidadeDao;
import br.com.webcommerce.dao.PermissaoDao;
import br.com.webcommerce.model.Analista;
import br.com.webcommerce.model.Funcionalidade;
import br.com.webcommerce.model.Permissao;

@Resource
public class PermissaoController {
	private Result result;
	private PermissaoDao perDao;
	private FuncionalidadeDao funDao;
	private AnalistaDao anaDao;
	
	public PermissaoController(FuncionalidadeDao funDao, PermissaoDao perDao, Result result, AnalistaDao anaDao) {
		this.result = result;
		this.perDao = perDao;
		this.funDao = funDao;
		this.anaDao = anaDao;
	}
	
	@Get @Path(value="/permissao/{id}")
	public void formulario(long id){
		result.include("analista", anaDao.getById(id));
		result.include("funcionalidadeList", funDao.getAll());
	}
	
	@Post @Path(value="/permissao/{id}")
	public void teste(long id, String ...permissoes){
		System.out.println(permissoes);
	}	
}

a variavel array de string permissoes no metodo teste vem nulo da minha view, não consigo imaginar o meu problema
estou usando Apache Tomcat 6.0 com VRaptor 3.1.2 e estou usando o SiteMesh

se alguem não entendeu é so avisar que eu tento explicar melhor

muito obrigado pela ajuda, abraços.

11 Respostas

Tenkara_Kiddo

Acabo de descobrir que se tenho 3 itens na minha lista
e seleciono somente 1 ele retorna null, se seleciono 2 itens da lista ele retorna o array com duas posições…

Tenkara_Kiddo

Tenkara Kiddo:
Acabo de descobrir que se tenho 3 itens na minha lista
e seleciono somente 1 ele retorna null, se seleciono 2 itens da lista ele retorna o array com duas posições…

Consegui finalizar o problema coloquei uma pequena POG que funcionou igual magica

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Editar Permissões</title>
</head>
<body>
	<form action="<c:url value="/permissao/${analista.id }"/>" method="post">
		<fieldset>
			<legend>Editar permissões para o usuário - ${analista.nome_analista }</legend>
			
			<c:forEach items="${funcionalidadeList}" var="funcionalidades">
				<input type="checkbox" name="permissoes" value="${funcionalidades.id}"/> ${funcionalidades.nome_tela } <br/> 
			</c:forEach>
			<input type="hidden" name="permissoes" value="0"/>
			
			<button type="submit">Enviar</button>
			
		</fieldset>		
	</form>
</body>
</html>

na linha 18 coloquei um input hidden com um valor qualquer (que eu tenho certeza que nao vai afetar minha app) com o mesmo nome do input de checkbox
então o vraptor recebeu um array de string com duas posições

obrigado a todos

Lucas_Cavalcanti

atualize para a última versão do VRaptor, que esse bug foi corrigido.

o que vai acontecer é que se vc não selecionar nenhuma checkbox, o permissões vai vir nulo.

Tenkara_Kiddo

obrigado Lucas,
na nova versão o array de string virá como vazio somente? ao inves de nulo (caso vazio)

Lucas_Cavalcanti

não, pq o VRaptor não tem como saber…

se vc não marca nenhum checkbox simplesmente não vem nenhum parâmetro “permissoes” no request. E ele entende isso como null.

Tenkara_Kiddo

ah legal Lucas, entendi direitinho brigadão
abraços.

rogerio.alcantara

Salve, salve turma!

Estava usando o VRaptor3 (3.1.3) e o maven2 (apenas para gerenciar as dependências do projeto) e encontrei o mesmo problema.

No meu POM, atualizei o VRaptor para versão 3.2.0, mas o problema persiste. o0’

Devo alterar alguma outra biblioteca?

Lucas_Cavalcanti

como vc está nomeando o seu checkbox?

coisa
coisa[]
ou
coisa[0], coisa[1], etc?

os dois últimos funcionam, se possível use o último

rogerio.alcantara

Olá Lucas,

Valeu pela resposta!

Eu estava usando apenas "coisas" para o name dos checkbox.

Alterei o name para coisas[index] e o html ficou assim:
<input type="checkbox" name="engines[0]" value="MATCHMAKER" checked="checked"> 
<label for="engines[0]">MatchMaker</label>

<input type="checkbox" name="engines[1]" value="GOOGLE" checked="checked"> 
<label for="engines[1]">Google</label>

<input type="checkbox" name="engines[2]" value="GOOGLEIMAGES" checked="checked"> 
<label for="engines[2]">Google Images</label>

<input type="checkbox" name="engines[3]" value="BING" checked="checked"> 
<label for="engines[3]">Bing</label>

<input type="checkbox" name="engines[4]" value="YAHOO" checked="checked"> 
<label for="engines[4]">Yahoo</label>
Ao postar, recebo a exception:
27/12/2010 14:26:36 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet default threw exception
br.com.caelum.vraptor.VRaptorException: Unable to find converter for java.lang.String
	at br.com.caelum.vraptor.core.DefaultConverters.to(DefaultConverters.java:57)
	at br.com.caelum.vraptor.http.ognl.VRaptorConvertersAdapter.convert(VRaptorConvertersAdapter.java:62)
	at br.com.caelum.vraptor.http.ognl.VRaptorConvertersAdapter.convertValue(VRaptorConvertersAdapter.java:58)
	at ognl.ArrayPropertyAccessor.setProperty(ArrayPropertyAccessor.java:112)
	at br.com.caelum.vraptor.http.ognl.ArrayAccessor.setProperty(ArrayAccessor.java:78)
	at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:2225)
	at ognl.ASTProperty.setValueBody(ASTProperty.java:127)
	at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
	at ognl.SimpleNode.setValue(SimpleNode.java:279)
	at ognl.ASTChain.setValueBody(ASTChain.java:227)
	at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
	at ognl.SimpleNode.setValue(SimpleNode.java:279)
	at ognl.Ognl.setValue(Ognl.java:737)
	at ognl.Ognl.setValue(Ognl.java:783)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createViaOgnl(OgnlParametersProvider.java:132)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createRoot(OgnlParametersProvider.java:108)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:90)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.getParametersFor(ParametersInstantiatorInterceptor.java:104)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at com.b2bmatchfinder.util.SessionLoaderInterceptor.intercept(SessionLoaderInterceptor.java:33)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at com.b2bmatchfinder.site.util.ClassificationInterceptor.intercept(ClassificationInterceptor.java:59)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at com.b2bmatchfinder.site.util.SiteAuthorizationInterceptor.intercept(SiteAuthorizationInterceptor.java:85)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:112)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
	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:127)
	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:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:662)
Acho que o problema é causado pq value do meu checkbox é uma String, certo?
Lucas_Cavalcanti

vc tá recebendo uma String[]? tenta trocar pra List.

ou tenta criar uma enum com essas strings e receber a enum como parâmetro (lista ou array)

rogerio.alcantara

CARALEO Lucas!

Só mudei para minha enum (já existia uma) e funfou lindio! ^^

SENSACIONAL!

\o/

Muito obrigado!

PS: VRaptor rulz! ;D

Criado 1 de dezembro de 2010
Ultima resposta 27 de dez. de 2010
Respostas 11
Participantes 3