VRaptor 3 e @Path com acentuação

Eu estou querendo usar um caminho com acentuação como o exemplo abaixo mas não funciona corretamente

@Path("/usuarios/relat[color=red]ó[/color]rio/{id}")
public void relatorio(Long id) {
// gerar relatório…
}

Existe alguma forma desse caminho com acentuação funcionar?

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.

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

http://registro.br/faq/faq6.html

[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

http://registro.br/faq/faq6.html[/quote]

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.

Como eu disse acima, se você usar relatório no URI ele será transformado em relat%C3%B3rio. Há uma documentação sobre isso na classe URLEncoder: http://java.sun.com/j2se/1.4.2/docs/api/java/net/URLEncoder.html

Bom saber !
Valeu pela explicação @garcia-jj

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.

cria uma classe filha de DefaultRouter e sobrescreva o método parse:

@Component
public class DecodedRouter extends DefaultRouter {

   //delegate constructor

   @Override
   public ResourceMethod parse(String uri, ...) {
        String decoded = decode(uri);
        return super.parse(decoded, ...);
   }

}

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á.

Um abraço e continue assim mandando boas dicas…