Problemas com Vraptor + Encoding

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?

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

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);							 			 		
				});												
			} 	
	);

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…

[quote=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…

[/quote]

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?

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?

[quote=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?[/quote]

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>

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

[quote=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[/quote]

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.

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’)

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

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

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.

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

[quote=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[/quote]

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.

[quote=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’)[/quote]

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

já tentou com o $.post?

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

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

ou use o $.get mesmo