Problemas com Vraptor + Encoding

22 respostas
worldsoft

Galera meu problema é que quando faço uma requisição ao servidor e nos parametrôs contenha um caractere especial tipo o valor chega na aplicação todo zuado.

Ex: Se eu requisitar uma lista de cidades com a string “São” o valor que chega na aplicação para ser procurado na base de dados é “São”

Obs.: Esse problema só acontece quando uso uma requisição ajax, pois quando faço a mesma requisição por um formulário os valores chegam ok.

Alguém poderia me ajudar?

22 Respostas

Lucas_Cavalcanti

como vc está fazendo a requisição ajax?

worldsoft

Estou usando jquery, segue o código:

$.getJSON('<c:url value="/states/list.json" />',		
			{field:$('input[name="fiel"]').val(), value:$('input[name="value"]').val()},
			function(section){								
				$.each(section, function(x) { 								
					 var tr = $('<tr>').appendTo('#tabela > tbody').attr('id','linha_'+ this.Id);					 
					 $('<td>').attr('id', 'state_'+this.id).appendTo(tr).text(this.id);
					 $('<td>').attr('id', 'id_nfe_'+this.id).appendTo(tr).text(this.idNfe);
					 $('<td>').attr('id', 'name_'+this.id).appendTo(tr).text(this.name);
					 var country = this.country;					 
					 $('<td>').attr('id', 'country_'+this.id).appendTo(tr).text(country.name);
					 
					 var link = $('<a>').attr('href','javascript:getValue('+this.id+')').text('Selecionar');  
					 
					 $('<td>').appendTo(tr).append(link);							 			 		
				});												
			} 	
	);
Lucas_Cavalcanti

tenta colocar isso em algum lugar (em um js importado em alguma página por exemplo):

$.ajaxSetup({
   contentType: "application/x-www-form-urlencoded;charset=UTF-8"
});

ou ISO-8859-1 como charset, dependendo do que vc está usando…

worldsoft

Lucas Cavalcanti:
tenta colocar isso em algum lugar (em um js importado em alguma página por exemplo):

$.ajaxSetup({
   contentType: "application/x-www-form-urlencoded;charset=UTF-8"
});

ou ISO-8859-1 como charset, dependendo do que vc está usando…

Lucas minhas jsp estão todas com essa tag:

e o meu web.xml com:

<context-param> <param-name>br.com.caelum.vraptor.encoding</param-name> <param-value>UTF-8</param-value> </context-param>

E coloquei o que vc me disse em um arquivo importando, não deu certo, depois coloquei antes de chamar esta função e também nada, e também já havia colocado:

$.ajaxSetup({scriptCharset:"UTF-8", contentType:"application/json; charset=UTF-8" }); também sem sucesso.

Tem mais algum lugar que eu tenha que configurar?

Lucas_Cavalcanti

tenta colocar no head do html:

<META http-equiv="Content-Type" content="text/html; charset=UTF-8">

o contentType do ajaxSetup tem que ser application/x-www-form-urlencoded mesmo…

em qual browser vc está testando isso?

worldsoft

Lucas Cavalcanti:
tenta colocar no head do html:

<META http-equiv="Content-Type" content="text/html; charset=UTF-8">

o contentType do ajaxSetup tem que ser application/x-www-form-urlencoded mesmo…

em qual browser vc está testando isso?

Lucas essa tag meta já se encontra no head, estou testando pelo chome e firefox.

Obs.: Estou usando o padrão adotado na apostila fj-28, eu acho que é esta que tem um prototipo chamado goodbuy então estou usando essas duas tags no web.xml

<include-prelude>/header.jspf</include-prelude> <include-coda>/footer.jspf</include-coda>

Lucas_Cavalcanti

tenta isso…

supondo que vc tem um form:

<form id="bolinha" action="<c:url value="/states/list.json" />">
     <input name="field"...>
     <input name="value" ...>
</form>

vc pode tentar fazer:

var form = $('#bolinha');
$.getJSON(form.attr('action'), form.serialize(), function(retorno) {
   //...
});

talvez assim ele pegue o encoding certo

worldsoft

Lucas Cavalcanti:
tenta isso…

supondo que vc tem um form:

<form id="bolinha" action="<c:url value="/states/list.json" />">
     <input name="field"...>
     <input name="value" ...>
</form>

vc pode tentar fazer:

var form = $('#bolinha');
$.getJSON(form.attr('action'), form.serialize(), function(retorno) {
   //...
});

talvez assim ele pegue o encoding certo

Infelizmente também não funcionou…
Já não sei mais o que tentar, já troquei o encode de utf-8 para iso-8859-1 e nada.

Lucas_Cavalcanti

mais uma coisa:

$.ajax({
    url: form.attr('action'),
    data: form.serialize(),
    dataType: 'json',
    contentType: "application/x-www-form-urlencoded;charset=UTF-8",
    success: function(retorno) {
         //...
    }
});

vc pode também tentar fazer um post ao invés de um get, pra ver se rola (method: ‘POST’)

worldsoft

Lucas esse é cabeçalho da requisição:

Request URL:http://localhost:8080/atlas/states/list.json?field=name&value=S%C3%A3o
Request Method:GET
Status Code:200 OK

Request Headers
Accept:application/json, text/javascript, */*; q=0.01
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4
Connection:keep-alive
Cookie:JSESSIONID=CD1BEB1EBE722E3D75D473E8C89C25FC
Host:localhost:8080
Referer:http://localhost:8080/atlas/cities/new
User-Agent:Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.237 Safari/534.10
X-Requested-With:XMLHttpRequest

Query String Parameters
field:name
value:São

Response Headers
Content-Type:application/json;charset=UTF-8
Date:Mon, 11 Jul 2011 18:27:05 GMT
Server:Apache-Coyote/1.1
Transfer-Encoding:chunked
Lucas_Cavalcanti

e se vc debugar no controller vem errado? ou só no BD?

worldsoft

O que acontece é que quando vou fazer carregar a lista do BD eu dou um print nas váriaves que vem da requisição antes de enviar para o hibernate e nesse momento os valores já estão zicados, por isso não carrega nada!

No banco está com os valores ok, e quando salvo valores com caracteres especiais vão tudo ok, e quando lista pelo form o valor vai ok também, o problema é realmente na requisição ajax.

Lucas_Cavalcanti

mas nessa requisição ajax ele chega zuado no controller?

essa requisição que vc está fazendo adiciona algo no banco?

se sim, tenta trocar de GET pra POST

worldsoft

Lucas Cavalcanti:
mas nessa requisição ajax ele chega zuado no controller?

essa requisição que vc está fazendo adiciona algo no banco?

se sim, tenta trocar de GET pra POST

Desculpas, não fui bem claro na minha resposta, então sim ele chega zuado no controller, e não adiciono nada no banco por essa requisição, apenas faço essa para obter uma lista para criar uma tela de dialog com o usuário.

worldsoft

Lucas Cavalcanti:
mais uma coisa:

$.ajax({
    url: form.attr('action'),
    data: form.serialize(),
    dataType: 'json',
    contentType: "application/x-www-form-urlencoded;charset=UTF-8",
    success: function(retorno) {
         //...
    }
});

vc pode também tentar fazer um post ao invés de um get, pra ver se rola (method: ‘POST’)

E dessa forma também não funcionou…
Cara tá difícil achar esse problema! rsrsrs…

mondor

já tentou com o $.post?

worldsoft

Então o $.post seria para submeter alguma coisa ao servidor e não para o mesmo me retornar algo, estou correto?

mondor

em partes… põe um return false; logo após do $.post

mondor

ou use o $.get mesmo

worldsoft
mondor:
ou use o $.get mesmo
$.get(form.attr('action'), function(d) {alert(d)}).success(function(a) { alert(a) });
Me desculpe minha ignorância mais ainda não estou bem familiarizado com ajax, seria isso aqui:
$.get({		
		url: '<c:url value="/states/list.json" />',
		data: form.serialize(),  
		dataType: 'json',  
		contentType: "application/x-www-form-urlencoded;charset=UTF-8",  
		success: function(section){						
					$.each(section, function(x) { 								
			 			var tr = $('<tr>').appendTo('#tabela > tbody').attr('id','linha_'+ this.Id);					 
			 			$('<td>').attr('id', 'state_'+this.id).appendTo(tr).text(this.id);
			 			$('<td>').attr('id', 'id_nfe_'+this.id).appendTo(tr).text(this.idNfe);
			 			$('<td>').attr('id', 'name_'+this.id).appendTo(tr).text(this.name);
			 			var country = this.country;					 
			 			$('<td>').attr('id', 'country_'+this.id).appendTo(tr).text(country.name);
				 
					 	var link = $('<a>')  
				    		.attr('href','javascript:getValue('+this.id+')')  
					    	.text('Selecionar');  
					 
					 	$('<td>').appendTo(tr).append(link);					 	
					});				
				},		
	});
worldsoft

Agora que eu vi, o mais engraçado é que para funcionar um requisição certa no form, tenho que por a tag:

com o charset diferente do pageEncoding, isso tá funcionando legal, agora se eu colocar tudo ISO-8859-1 ou UTF-8 não funfa nada.

Alguém sabe o por que?

Obs.: Mais mesmo assim uma requisição ajax não tá funcionando…

pgnt

Resolvi adicionando no web.xml

&lt;context-param&gt;
    &lt;param-name&gt;br.com.caelum.vraptor.encoding&lt;/param-name&gt;
    &lt;param-value&gt;UTF-8&lt;/param-value&gt;
&lt;/context-param&gt;

abs

Criado 11 de julho de 2011
Ultima resposta 11 de dez. de 2012
Respostas 22
Participantes 4