12Sobrescrevendo as convenções e o comportamento do VRaptor

A maioria dos comportamentos e convenções do VRaptor são personalizáveis. E a forma de personalizar é bem fácil: criar um componente que implementa uma das interfaces internas do VRaptor. Ao fazer isso, o VRaptor vai usar a implementação personalizada ao invés da padrão. Para saber qual é a interface certa para personalizar um certo comportamento, pergunte na lista de usuários do VRaptor: caelum-vraptor@googlegroups.com ou no fórum do GUJ.

Abaixo veremos alguns exemplos de personalização:

Mudando a view renderizada por padrão

Se você precisa mudar a view renderizada por padrão, ou mudar o local em que ela é procurada, basta criar a seguinte classe:

@Component
public class CustomPathResolver extends DefaultPathResolver {

    @Override
    protected String getPrefix() {
        return "/pasta/raiz/";
    }

    @Override
    protected String getExtension() {
        return "ftl"; // ou qualquer outra extensão
    }

    @Override
    protected String extractControllerFromName(String baseName) {
        return //sua convenção aqui
               //ex.: Em vez de redirecionar UserController para 'user'
               //você quer redirecionar para 'userResource'
               //ex.2: Se você sobrescreveu a conveção para nome dos Controllers para XXXResource
               //e quer continuar redirecionando para 'user' e não para 'userResource'
    }

}

Se você precisa mudar mais ainda a convenção basta implementar a interface PathResolver.

Mudando a URI padrão

Por padrão, a URI para o método ClientesController.lista() é /clientes/lista, ou seja, nome_do_controller/nome_do_metodo. Para sobrescrever essa convenção, basta criar a classe:

@Component
@ApplicationScoped
public class MeuRoutesParser extends PathAnnotationRoutesParser {
    //delegate constructor
    protected String extractControllerNameFrom(Class<?> type) {
        return //sua convenção aqui
    }

     protected String defaultUriFor(String controllerName, String methodName) {
        return //sua convenção aqui
    }
}

Se você precisa mudar mais ainda a convenção, basta implementar a interface RoutesParser.

Mudando o encoding da sua aplicação

Se você quiser que todas as requisições da sua aplicação sejam de um encoding determinado, para evitar problemas de acentuação por exemplo, você pode colocar o seguinte parâmetro no seu web.xml:

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

Assim, todas as suas páginas e dados passados para formulário usarão o encoding UTF-8, evitando problemas de acentuação.