VRaptor

Migrando de um projeto com VRaptor 3

Java 7 e CDI 1.1

Para utilizar o VRaptor é necessário possuir o JDK 7 e um Application Server ou Servlet Container que possua suporte ao Servlet 3.1.

Beans.xml

Como agora o VRaptor usa o CDI como container, para ele conseguir escanear suas classes você precisa adicionar o arquivo beans.xml dentro da pasta META-INF/beans.xml de seu projeto. Se você usa maven, adicione em /src/main/resources/META-INF. Você pode usar como exemplo o arquivo beans.xml do nosso blank-project.

Containers IoC

A maior alteração do VRaptor é de usar o CDI (Context Dependency Injection). Com isso não é necessário mais usar os providers anteriores (Guice, Pico e Spring).

O CDI exige que cada classe possua o construtor padrão (sem argumentos). Sendo assim você deverá adicionar o construtor padrão em todos os componentes. E o construtor onde serão injetados os componentes deve possuir a anotação @Inject.

@Controller
public class MeuController {
    private final MeuComponente meuComponente;

    /**
     * @deprecated CDI eyes only
     */
    protected MeuController() {
        this(null);
    }

    @Inject
    public MeuController(MeuComponente meuComponente) {
        this.meuComponente = meuComponente;
    }
}

Static scanning

Se você usava este recurso, ele não é mais necessário, pois o scanning de classes é feito de forma otmizada pelo CDI. Basta remover as configurações do seu build.

Eventos de inicialização

No VRaptor 3, quando você anotava um componente com @ApplicationScoped, o código era executado na inicialização do sistema. Com o uso do CDI, agora é necessário usar a anotação @Observes:

@ApplicationScoped
public class PrintLog {

    public void whenApplicationStarts(@Observes ServletContext context) {
        logger.info("My application is UP");
    }
}

Alterações em assinaturas de métodos e classes

Muitas classes internas foram atualizadas ou removidas. Se você sobrescreveu algum comportamento interno do VRaptor, verifique em nossa api docs as novas assinaturas.

Todos os métodos anotados com @Deprecated do VRaptor 3 foram removidos.

OGNL

Se você usava o OGNL, ele não é mais suportado no VRaptor 4. Atualmente é suportado apenas o IOGI, que possui todas as funcionalidades do OGNL, além de suporte a Set e objetos imutáveis.

Validação

A validação fluente foi removida, e agora você pode usar o Bean Validation. Para compatibilidade você pode usar os métodos Validator.check(boolean, Message) para efetuar validações mais simples.

A interface Validator foi alterada de pacote, e agora está localizada em br.com.caelum.vraptor.validator.Validator.

As classes filhas de Message foram alteradas. A classe ValidationMessage agora é SimpleMessage e o construtor foi alterado para SimpleMessage(String param, String message, Object... params), mantendo assim compatibilidade com as demais implementações.

Converters

Os converters localizados agora fazem parte do pacote padrão, e são registrados automaticamente. Portanto se você tiver a declaração do pacote br.com.caelum.vraptor.converter.l10 no seu web.xml, remova-o.

Os converters sofreram alterações, e agora não recebem mais o objeto ResourceBundle no método convert. Se você precisa usar algo baseado no Locale, você deve injetá-lo no construtor.

A interface Converter foi alterada de pacote, e agora está localizada em br.com.caelum.vraptor.converter.Converter.

Remoção dos escopos

Nós removemos todos os antigos scopos do core do vraptor. No lugar deles, você pode usar os seguintes escopos definidos no pacote javax.enterprise.context:

@javax.enterprise.context.RequestScoped
@javax.enterprise.context.SessionScoped
@javax.enterprise.context.ApplicationScoped
@javax.enterprise.context.ConversationScoped
@javax.enterprise.context.Dependent

Uma alternativa simples para migrar os escopos é fazer um replace de br.com.caelum.vraptor.ioc para javax.enterprise.context nos imports.

Fabricando de componentes

A interface ComponentFactory não existe mais. Desta forma você deve usar o @Produces do CDI. Veja mais no capítulo de componentes.

Sobrescrevendo componentes

No VRaptor3 para sobrescrever os componentes era necessario apenas implementar ou estender a interface ou classe do componente. Por limitações no CDI é necessário agora anotar a sua classe com @Specializes.

@Resource substituído pelo @Controller

A anotação @Resource foi substituída pela anotação @Controller e possui o mesmo efeito.

Não existe mais a interface Localization

No lugar de receber a Localization e chamar os métodos .getLocale() ou .getBundle(), agora você pode injetar diretamente esses elementos, algo como:

public class MinhaClasse {

    @Inject
    private Locale locale;

    @Inject
    private ResourceBundle bundle;
}

A maior diferença é que onde você fazia:

localization.getBundle().getMessage("key");

Você vai chamar diretamente o getString do bundle:

bundle.getString("key");

LinkTo

A funcionalidade LinkTo foi atualizada e agora suporta o uso de métodos nas chamadas. Sendo assim você deve converter todas as chamadas de ${linkTo[Controller].metodo[0, 1]} para ${linkTo[Controller].metodo(0, 1)}. Veja mais informações no capítulo sobre Views.

Pra facilitar a migração deixamos um .sh aqui, que você pode baixar e executar um sed de atualização da sintaxe (para linux e mac, em breve faremos algo pra windows).

Serialização e deserialização

Para seguir com a especificação do HTML5, todas as datas usadas na serialização e deserialização usam o formato ISO8601.

Restfulie

Não é suportado mais no core do VRaptor, mas sim como plugin.