Não existe acentos em uma URI. Todas as URIs e URLs são, snme, ASCII. Se você realmente quer usar acentos na URI creio que você usar seu path como relat%C3%B3rio deva funcionar.
[quote=Edufa]url permite acentos e caracteres especiais, mas não sei como funciona por baixo dos panos, não cheguei a ler tudo e posso estar falando besteira
Não, não aceita. Todo caractere que não está no intervalo ASCII é codificado. Tanto que domínios com acentos são convertidos. No próprio site que você mandou explica que pãoemaçã.com.br é transformado em pãoemaçã.com.br.
Garcia-jj, eu também tinha pensado na solução de colocar no path, a uri gerada pelo browser e funcionou bem, exemplo:
@Path("/relat[color=red]ó[/color]rio") por @Path("/relat[color=red]%C3%B3[/color]rio")
Mas eu tive um outro problema que sua sugestão deu a dica para a solução, vamos ao problema:
Eu tenho uma classe Usuario que tem como chave primária(id) uma string chamada login. No meu UsuariosController existe
um método que irá popular o formulário para a edição do usuário como a seguir:
@Path("/usuarios/edita/{login}")
public Usuario edita(String login) {
// carrega o usuário pelo login
return dao.carrega(login);
}
O grande problema é quando existir um login com acentuação. O dao não conseguirá carregar o usuário porque o login
estará codificado para o padrão da URI.
Exemplo: andré será andr%C3%A9
Solução: Usar a classe URLDecoder
@Path("/usuarios/edita/{login}")
public Usuario edita(String login) {
// Resolve problema de acentuação
String loginTraduzido = login;
try {
loginTraduzido = URLDecoder.decode(login, “UTF-8”);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// carrega o usuário pelo login
return dao.carrega(loginTraduzido);
}
Gostaria de agradecer as ajudas oferecidas e deixo a solução acima para quem usar
alguma classe que tenha como id ou chave primária uma string
Uma coisa que você pode fazer é sobrescrever os componentes do vraptor que injetam os parametros e também o que resolve o Path. Assim você pode facilmente trabalhar com os URI/URLs com acentos. Vou ver aqui com calma quais são esses componentes e te aviso.
Valeu Lucas, muito valiosa a sua dica. Ela funcionou corretamente, só houve um probleminha.
Para a classe que extende a DefaultRouter funcionar é preciso anota-la como @ApplicationScoped, porque
se não anotarmos nada o VRaptor entenderá que essa classe faz parte do escopo do Request e não funcionará.