Problemas com acentuação no Vraptor com Json

Pessoal, preciso da ajuda de vocês com um problema que já fiz tudo que encontrei nos foruns e não resolveu.
Estou utilizando o Vraptor-3.4.1 com Json em uma tela para eliminar os refresh. Em uma das funcionalidades eu envio os parâmetros para o controller via Json e salvo os registros no banco, ocorre que os textos com acento estão chegando desconfigurados (ex.: João chega no controller João). Já fiz os ajustes mais óbvios, ex.:

  • Defini no web.xml o UTF-8 como padrão:

<jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <page-encoding>UTF-8</page-encoding> <scripting-invalid>true</scripting-invalid> <include-prelude>/WEB-INF/jsp/prelude.jspf</include-prelude> </jsp-property-group> </jsp-config> <context-param> <param-name>br.com.caelum.vraptor.encoding</param-name> <param-value>UTF-8</param-value> </context-param>

  • Nos jsp também defini tudo como UTF-8:
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

Acontece que o problema permanece e ainda aumentou, pois agora as mensagens de confirmação na tela com jQuery estão desconfiguradas também.

Debugando o código percebi que o parâmetro já esta chegando errado na entrada do método e que em uma outra funcionalidade que usa a mesma tela/controller que não precisam do Json eu passo os dados para o controller através do bean e eles entram no método corretamente sem problemas nos acentos.

O que fazer?

Agradeço a ajuda!

Se você estiver usando HTML 4 coloque isso no <head> das suas páginas:

&lt;meta http-equiv="Content-Type" content="text/html;charset=utf-8" &gt;

Se você estiver usando XHTML, coloque:

&lt;meta http-equiv="Content-Type" content="text/html;charset=utf-8" /&gt;

Se você estiver usando HTML 5, coloque:

&lt;meta charset="utf-8"&gt;

Veja se isso resolve…

Rafael, obrigado pela resposta, mas não funcionou.

Uma coisa que talvez seja importante é que estou usando o sitemash, porém, no caso da sua resposta, eu coloquei a tag no head de cada jsp e também no meu arquivo header onde estão os padrões dos jsp.

O que esta muito estranho é que esta UTF-8 no sistema inteiro e as mensagens via jquery estão entrando sem acento, assim como quando mando os parâmetros para o controller via Json.

Outra coisa também é que eu inciei esse projeto em cima do “vraptor-blank-project”. Fiz pouquíssimas alterações.

Um abraço,
Mauricio

o que está com o acento quebrado é algo que veio de dados de formulário, ou veio direto do banco, ou de algum outro lugar?

Lucas os dados saem dos inputs na tela, eu pego eles pelo jquery e com o Json mando para o controller. No controller eu faço uma verificação dos dados e se são válidos salvo no banco. Ocorre que quando pego os dados na chamada do método, o que possuem acento já chegam quebrados. Nos métodos que eu consigo usar um mapeamento (bean) isso não ocorre, mas nesse caso, como estou enviando os dados via Json, estou colocando no método os atributos que preciso receber.

[quote]public void adiciona(Long idUoPai, String codigoSistema, String nome, Long idTipoAtividade, Long idTipoUnidade, String nivelCombo){
[/quote]

Tem como via Json eu passar um bean?

Um abraço
Mauricio

Olá,
Tem como você receber no seu controller o seu objeto json renderizado, isso o VRaptor faz.

Exemplo:

 @Post
	@Path("/salvar/meuObjetoQualquer")
	@Consumes("application/json")
	public void savar(MeuObjeto meuObjeto) {
           //Codigo que manipula isso		  
   
	}

Com relação ao encoding existe varios fatores que pode influenciar nisso, mas o que me parece é que seu projeto esta subindo usando ISO-8859-1 e ao receber a solicitação
ajax ele esta recebendo um UTF-8 por este motivo quebra a codificação por se tratar de tabelas não correlatas.

Faça um teste e manda para a gente avaliar, segue:

    $.ajax({
       url:'/salvar/meuObjetoQualquer'
,
       type:"POST",
       data:data,
       contentType:"application/json; charset=ISO-8859-1",
       dataType:"json",
       success: function(){
         ...
       }
    })

Veja que no contentType eu forcei ele mandar usando a tabela ISO, depois disso tente usar UFT-8 e nos diz se algum deles funcionou, para ai então iniciar-mos a
configuração necessário de enconding.

Até mais!!!

com formulários normais dá o mesmo problema?

pra preencher um objeto, os nomes dos campos precisam ser do tipo “objeto.nomeDoAtributo”, mesmo no json…

pra tentar resolver o problema do encoding, vc pode fazer algo do tipo:

$.ajax({
        data: parameters,
        type: "POST",
        url: ajax_url,
        contentType: "application/x-www-form-urlencoded;charset=UTF-8",
        dataType: 'json',
        success: callback
});

Sehores, muito obrigado pela ajuda, o problema esta resolvido.

Gostaria apenas de pedir a opnião de vocês com o seguinte: - inicialmente minhas páginas não estavam definidas como utf-8, mas com o ISO-8859-1. Ocorre que depois de algumas pesquisa para solucionar o problema com o Json, muitas pessoas falavam no uso apenas do UTF-8, mas ele, por algum motivo, esta desconfigurando as mensagens com acento por exemplo do Jquery validate.

Para resolver isso eu implementei as instruções de vocês e alterei minhas páginas para o seguinte:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="UTF-8"%> 

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

A dúvida é: essa é a forma mais elegante de resolver este problema ou isso que estou fazendo é uma gambi?

Um abraço e novamente obrigado pela ajuda!

Olá,
Essa configuração não esta coerente, pois você esta dizendo para a pagina ser enviada para o browser usando UTF-8 e para o browser
você esta falando para ele decodificar usando ISO-8859-1.

Se seu projeto for usar ISO, faça as seguintes configurações:
1 - Alterar o pageEncoding=“UTF-8” para pageEncoding=“ISO-8859-1”.

2 - Sempre informar no contentType da sua chamada ajax application/x-www-form-urlencoded; charset=ISO-8859-1" se vc não informar isso
o jquery irá usar o default que é application/x-www-form-urlencoded; charset=UTF-8".

Caso você for usar UTF-8 converta seus arquivos usando o seguinte código:

     public static void main(String args[]) {
		
			try {
				FileInputStream fis = new FileInputStream(new File("seuArquivoUsandoISO.js"));
				
				byte[] contents = new byte[fis.available()];
				fis.read(contents, 0, contents.length);
				
				String asString = new String(contents, "ISO-8859-1");
				byte[] newBytes = asString.getBytes("UTF-8");
				
				FileOutputStream fos = new FileOutputStream("seArquivoUsandoUFT8.js");
				
				fos.write(newBytes);
				fos.close();
			} catch(Exception e) {
				e.printStackTrace();
			}
		
	}

2 - Altere os contentTypes e meta de seus JSP para usar UTF-8.

É isso ai!!!

abraço!