Problema com Json para salvar idMunicipio com Vraptor [RESOLVIDO]

13 respostas
well

Pow estou com um problema, tenho um combo aninhado seleciono o estado ele me mostra os municipios... ai tenho que salvar o ID do municipio em outra tabela... ja tem os relacionamentos e tudo mas...

a jsp ta assim
<label for ="municipio">municipio:</label>
			
				<select name="bci.municipioLocal.id" id="municipio" >
					<c:forEach var="mun" items="${municipios}">
						<option value="${mun.id}">${mun.nome} </option>
					</c:forEach>
				</select>

se eu faço do jeito que esta acima ele lista normal mas aparece o seguinte erro na hora de salvar...

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

br.com.caelum.vraptor.InterceptionException: There are validation errors and you forgot to specify where to go. Please add in your method something like:
validator.onErrorUse(page()).of(AnyController.class).anyMethod();
or any view that you like.
If you didn't add any validation error, it is possible that a conversion error had happened.
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:69)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:90)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:44)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.26 logs.
mas se faço assim, lista todos os municipios, sem fazer a consulta. porem salva....
<label for ="municipio">municipio:</label>
			
				<select name="bci.municipioLocal.id" id="municipio" >
					<c:forEach var="mun" items="${municipios}">
						<option value="${mun.id}">${mun.nome} </option>
					</c:forEach>
				</select>

O que pode ser???

13 Respostas

Lucas_Cavalcanti

qual é a diferença do código de cima e o de baixo mesmo? parece igual pra mim.

o erro que deu é de conversão:

ou seja, vc tá mandando um texto no lugar de número, ou algo do tipo no meio do formulário

well

desculpa… foi o errado…

<label for ="municipio">municipio:</label>  
                  
                    <select name="bci.municipioLocal.id" id="bci.municipioLocal.id" >  
                        <c:forEach var="mun" items="${municipios}">  
                            <option value="${mun.id}">${mun.nome} </option>  
                        </c:forEach>  
                    </select>

assim lista todos os municipios idependente do estado…
mas salva no bd…

Lucas_Cavalcanti

o id do select não faz diferença pro vraptor, só o name…

o erro que está acontecendo é outro…

foi só o id que vc mudou?

well

Pois é, o id não faz diferença para o Vraptor. to achando estrando pois quando abro o browser para ver o option, ele esta vindo carregado…

<label for ="municipio">municipio:</label>
			
				<select name="bci.municipioLocal.id" id="municipio" >
					
						<option value="1">ACRELANDIA </option>
					
						<option value="2">ASSIS BRASIL </option>
					
						<option value="3">BRASILEIA </option>
.....
</select>

será que o value esta vindo como String… pois na tabela é para salvar com Long(BigInt) no Mysql.

e ser for como eu faço para fazer o cast…

Desde de ja agradeço…

E só para lembrar Parabéns pela nova Versão do Vraptor… espero que o Vraptor faça muito sucesso… e cada dia se torne maior… Parabéms Lucas, e todo o pessoal que colaborou…

Lucas_Cavalcanti

o VRaptor converte automaticamente a string pra Long… só precisa ver qual é o erro de conversão que está acontecendo…

coloca um:

validator.onErrorRedirectTo(this).form(); //ou qqer que seja o seu método do formulário

no começo da lógica problemática, e manda imprimir no jsp do formulário a variável ${errors} (se vc já não fez isso)

ele vai dar um caminho e o erro de conversão que aconteceu, dá pra ter uma idéia melhor

well

Bom, o que vc disse eu fiz a msg é a seguinte… [br.com.caelum.vraptor.validator.ValidationMessage@1b4ee5e]

:frowning:

Acho que deve estar vindo de outro lugar…

o js esta assim

function adjustMunicipioDropdown() {
        var estadoValue = $('#estadoDropdown').val();
        var dropdownSet = $('#municipio');
        if (estadoValue.length == 0)
        {
                dropdownSet.attr("disabled", true);
                dropdownSet.emptySelect();
        }
                else
        {
                dropdownSet.attr("disabled", false);

                $.getJSON('/webgeo/municipios/buscaMunicipios.json', {
                        uf : estadoValue
                }, function(data) {
                        dropdownSet.loadSelect(data);
                });
        }
}

e o municipio controller esta assim

@Get @Path("/municipios/buscaMunicipios.json")
	public void loadMunicipios(String uf){
	    List<Municipio> municipios = dao.lista(uf);
	    result.use(Results.json()).withoutRoot().from(municipios)
	    .include("nome")
	    .serialize();
	}
Lucas_Cavalcanti

imprima com:

<c:forEach var="error" items="${errors}">
    ${error.category} - ${error.message}<br />
</c:forEach>
well

Ta feia a coisa aki… deve ser algo muito besta… muito bacana essa parada de verificacao de erros… olha a msg “bci.municipioLocal.id - ???is_not_a_valid_integer???”

ta dizendo que bci.municipioLocal.id nao é um integer valido… certo!!!

mas que coisa, se eu tiro o id do select, para nao fazer a busca do municipio pelo estado, ele salva no BD. mais se eu o coloco para listar somente os municipios do estado que eu quero ele da esse erro…

Já nao estou enchergando o problema… :frowning:

Lucas_Cavalcanti

dropdownSet.loadSelect(data);

o que esse código faz?

será que ele tá setando a value da option corretamente?

well

isso faz apenas uma comparacao do id do estado com o do municipio… bom eu acho pelos testes que fiz aki…

mas se eu apago a funcao, ele para de buscar, mas ai salba no BD… to tentado aki… se eu resolver posto ai…

$.getJSON('/webgeo/municipios/buscaMunicipios.json', {
                        uf : estadoValue
                }, function(q) {
                        dropdownSet.loadSelect(q);
                });
well

achei algo de estranho, quando eu seleciono, o Estado lista somente o municipio daquele estado porem no fonte do browser ele lista todos… essa comparacao nao esta sendo feita no BD e sim no Cliente…

Vc tem algum exemplo de combo aninhado… to achando esse q estou usando meio ruin… alem de estar dando um dor de cabeça…

Lucas_Cavalcanti

bom, o erro tá nessa lógica de popular o combo de municípios mesmo…

tem um post que explica isso que vc quer, mas o site aparentemente tá fora do ar
http://tnogueira.com/blog/2010/04/28/carregando-combo-de-estado-e-municipios-utilizando-ajax-com-jquery-json-e-vraptor-3-1-2/

se não conseguir acessar, use o cache do google:

http://webcache.googleusercontent.com/search?q=cache:Z0MOGIYTk_kJ:tnogueira.com/blog/category/framework/vraptor3/+combo+estado+municipios+site:tnogueira.com&cd=1&hl=pt-BR&ct=clnk&gl=br&source=www.google.com.br

well

Bom Lucas, obragadao pela força mesmo… ja tinha procurado o site do tnogueira… pois a muito tempo ja havia feito o teste de combos porem sem salvar…
como nao estava conseguindo acessar o site dele foi importante vc ter me mandado o cache do google…

como estava tudo correto resolvi mandar um email para o tnogueira, ele foi muito prestativo e me ajudou… a solução ficou a seguinte…

na jsp ficou assim

<label for ="municipio">municipio:</label>
			
				<select name="bci.municipioLocal.id" id="municipio" >
						<option value="${bci.municipioLocal.id}">${bci.municipioLocal.nome} </option>
				</select>

no js teve apenas de mudar uma linha, o optionData de baixo tb estava como nome… dai vinha o erro… era para ser optionData.id

var option = new Option(optionData.nome,
                    optionData.id);

e no controller tinha que retirar o exclude(“id”)
porem essa parte eu já havia feito.

@Get @Path("/municipios/buscaMunicipios.json")
	public void loadMunicipios(String uf){
	    List<Municipio> municipios = dao.lista(uf);
	    result.use(Results.json()).withoutRoot().from(municipios)
            //.exclude("id")
	    .serialize();
	}

Bom é só isso… Obrigado a vc Lucas e ao Tnogueira… que por email me disse que semana que vem o site estará no ar novamente…

vlw pessoal…

Criado 9 de maio de 2011
Ultima resposta 10 de mai. de 2011
Respostas 13
Participantes 2