Lançamento do VRaptor 4 final

Depois de mais de 60 mil downloads diretos do VRaptor 3 (sem contar via maven), mais de dois mil commits, a versão 4.0.0.Final do VRaptor está disponivel para download. Junto com ela um novo site com novidades sobre as atualizações do framework. Você já pode começar a usar baixando o blank-project ou nosso projeto exemplo, o vraptor-musicjungle.

Ou se você utilizava alguma versão anterior, já pode atualizar a dependência em seu projeto:

<dependency>
    <groupId>br.com.caelum</groupId>
    <artifactId>vraptor</artifactId>
    <version>4.0.0.Final</version>
</dependency>

E se você nao conhece o VRaptor, pode começar agora pelo guia de 1 e de 10 minutos.

O VRaptor 4 utiliza o CDI 1.1 como container de DI (injeção de dependências), portanto tira proveito das features específicas dessa já conhecida e bastante utilizada especificação do JavaEE 7.

E o melhor, utilizando VRaptor você também pode tirar proveito desses recursos. Caso anda não esteja familiarizado com o CDI, você pode ler como começar com essa especificação, conhecer algumas das features da versão 1.1 e entender como customizar a produção de suas dependências, tudo no blog da Caelum.

Trabalhando com eventos do CDI

Nosso fluxo principal agora é tratado com eventos do CDI, assim nosso código ficou ainda mais desacoplado e extensível. Nessa página da documentação exibimos um mapa dos eventos e seus observers, assim como uma explicação simples sobre o que cada um deles representa.

Você pode facilmente observar os eventos do VRaptor, para isso basta escrever um observer simples como esse:

import javax.enterprise.event.Observes;
import br.com.caelum.vraptor.events.ControllerNotFound;

public class ControllerNotFoundHandler {
	
	public void metodo(@Observes ControllerNotFound evento) {
		// alguma ação para quando o controller não for encontrado
	}
}

Um novo modelo de Interceptors

Se você precisa de ordenação na execução de seus eventos, considere utilizar Interceptors. O VRaptor 4 possui um novo modelo baseado em anotações! Veja como pode escrever seu interceptor:

@Intercepts
public class ApplicationInterceptor {

    @Accepts
    public boolean accepts(ControllerMethod method) {
        return method.containsAnnotation(Audit.class);
    }

    @BeforeCall
    public void before() {
        // código a ser executado antes da lógica
    }

    @AfterCall
    public void after() {
        // código a ser executado depois da lógica
    }

    @AroundCall
    public void intercept(SimpleInterceptorStack stack) {
        // código a ser executado antes da lógica
        stack.next(); // continua a execução
        // código a ser executado depois da lógica   
    }
}

Um interceptor sem o método anotado com @Accepts é global, ou seja, vai interceptar todas as requisições. Outra novidade dos interceptors é que você pode utilizar os aceptors customizados como o @AcceptsWithPackage e @AcceptsWithAnnotations:

@Interceptor
@AcceptsWithAnnotations(Audit.class)
public class AuditInterceptor { ... }

A criação de seus próprios custom acceptors é bem simples e está bem detalhada aqui.

Environment integrado ao core

O plugin vraptor-environment foi integrado ao core e ganhou novas features! Você ainda pode receber o Environment injetado e chamar seu método get para ler propriedades, dessa forma:

String email = environment.get("email");

Porém agora como alternativa você pode simplesmente pedir a propriedade injetada com o uso da anotação @Property:

@Inject @Property private String email;

Como neste caso a propriedade tem o mesmo nome da chave, passar o value é opcional. Mas você poderia fazer algo como:

@Inject @Property(value="email-de-dev") 
private String email;

… e ainda passar um valor default, para caso a propriedade não exista:

@Property(value="email-de-dev", defaultValue="dev@caelum.com.br").

E quanto aos nossos plugins?

Dentre diversos outros aqui não listados, os seguintes plugins já possuem uma versão compativel com essa nova versão do framework:

vraptor-time-converters – trabalhar com date time e java time
vraptor-simplemail – já conhecido plugin de envio de emails
vraptor-errorcontrol – controle de erros efetivo com envio de e-mails
vraptor-quartzjob – schedule Quartz para agendamento de tarefas
vraptor-freemarker – trabalhar com templates do freemarker
vraptor-jpa e vraptor-hibernate – produtores e controle de transação
vraptor-brutauth, vraptor-shiro e vraptor-authz – autent. e autorização
vraptor-dash – dashboard com diversar ferramentas pro seu projeto

Você pode ler mais sobre essas e outras novidades no site do framework. O VRaptor 4 é uma evolução da versão 3, portanto grande parte dos conceitos como as convenções, injeção pelo construtor e uso do Result, continuam da mesma forma. Para te ajudar a migrar de VRaptor 3 para VRaptor 4 criamos esse tutorial.

Agradecemos a todos os desenvolvedores ativos e pessoal da comunidade que contribuem tanto para o crescimento do projeto. Esse é o momento perfeito para usar VRaptor 4 em seus projetos, vários projetos já estão usando em produção, inclusive o guj.com.br que utiliza desde sua primeira versão beta publica.

Tags: , , ,

21 Comentários

  1. Roberto Shizuo 28/04/2014 at 13:14 #

    um projeto que a caelum nao só cuida como me ajuda muito! parabens!

  2. Dilnei Cunha 28/04/2014 at 22:28 #

    A Caelum esta de parabéns!!! um grande framework, uma ferramenta muito poderosa, obrigado pelo Vraptor 🙂

  3. Luiz Ferreira 29/04/2014 at 10:44 #

    Animal !!!

    Ja atualizei um de meus projetos , vlw galera.

  4. Erick kande 29/04/2014 at 13:31 #

    valeu galera, muito bom artigo mas gostaria de vos pedir caso possivel atulizem a apostila fj28 “vraptor, hibernate”etc…

  5. Ythalo Rossy 29/04/2014 at 23:10 #

    O VRaptor além de flexível torna o aprendizado bem mais simplificado.

  6. Cácio Costa 30/04/2014 at 07:59 #

    Ficou show de bola! Parabéns pelo excelente trabalho… Que ele se consolide cada vez mais no mercado!!!

  7. Bronx 30/04/2014 at 23:37 #

    O que me incomodou foi a adoção do CDI. Se olharmos no próprio código da aplicação de exemplo (MusicJungle), há várias classes que declaram o construtor padrão somente para aderirem à especificação – e isso não acontecia com Guice/Spring. Acho que por ora vou continuar com o 3. =/

  8. Paulo Silveira 01/05/2014 at 18:53 #

    bronx, vamos resolver isso com o CDI 2.0!

  9. Lucas Augusto 03/05/2014 at 00:48 #

    Já curto o VRaptor faz um tempo, e acho muito vantajoso usar. A simplicidade dele é fenomenal. Só queria saber se existe alguma funcionalidade nativa para fazer template no VRaptor, hoje eu uso o tiles para para isso e seria uma boa ter algo nativo.

    Grande abraço e parabéns pelo grande sucesso que esta versão vai fazer sem dúvida.

  10. Rodrigo Turini 04/05/2014 at 11:03 #

    Oi Lucas! Ainda não existe nada nativo, mas queremos investir mais no trabalho com a view sim. Novos plugins e funcionalidades integradas ao core devem aparecer muito em breve! Idéias, issues e pull requests são mais do que bem vindos =)

  11. João 05/05/2014 at 14:02 #

    Muito legal o projeto, parabéns. Só uma dúvida, JSP não é mais desenvolvido e foi abandonado pela Oracle, ou estou enganado? Isso não trará problemas ? Porque não utilizar outra solução para a View?

  12. Ayran Andrade 05/05/2014 at 14:45 #

    Gostaria que a apostila FJ-21 que possui um apendice falando sobre o VRaptor fosse atualizada. Obrigado !

  13. Rodrigo Turini 05/05/2014 at 17:39 #

    João, legal que gostou! Quanto a essa descontinuidade da JSP, não tenho certeza. Tem alguma referência? De toda forma, uma das grandes vantagens da integração com CDI é ter tornado o VRaptor ainda mais flexivel e extensivel… dá pra especializar de forma simples os componentes necessarios pra você rodar em alguma outra solução de view.

  14. Rodrigo Turini 06/05/2014 at 13:37 #

    Ayran, excelente sugestão! Adicionei no meu TODO aqui, logo vamos atualizar sim =)

  15. Walter 25/09/2014 at 14:04 #

    Sugiro resolver a questão do Bronx dando suporte ao Spring, que é o padrão de mercado de fato para Injeção de dependência, pois, já esta no mercado a muitos anos e não é um bebezinho de menos de um ano de idade ( cdi 2.0). CDI 1 nem falo nada… bugado, ineficiente e não se integra a nada.

  16. Igor 01/02/2015 at 12:37 #

    Parabéns pelo framework.

    Vida longa ao vRaptor!!!

  17. Marcelo Oliveira 03/02/2015 at 11:39 #

    Galera vai ter uma atualização da apostila da caelum para o VRaptor 4? se sim, qual a previsão de lançamento?

  18. Rodrigo Turini 03/02/2015 at 13:44 #

    Oi Marcelo! Por enquanto não tem previsão, estamos investindo mais na documentação do site, que é aberta e todos podem contribuir. Alguns cursos já estão sendo migrados, como por exemplo o PM-87 que já usa VRaptor 4.

  19. Silas Cardoso 03/07/2015 at 22:39 #

    Pessoal, parabéns pelo excelente framework, é simples, funciona muito bem, e deixa o código muito limpo. Até agora a documentação do site esta suprindo 70% das minhas dúvidas, para o restante das dúvidas estou utilizando a documentação do VRaptor3 com adaptações, e o restante no google. Quanto ao uso, não tenho nada a reclamar. Só tive muita dificuldade para instalar o framework, estou acostumando a copiar os JAR’s para os projetos, e perdi vários dias para instalá-lo, tive problemas com incompatibilidade com as versões do CDI, do Hibernate, etc. Quase que desisti de utilizar o framework, ainda bem que insisti. Vocês poderiam disponibilizar todos os JAR’s em um repositório para quem não quer utilizar o MAVEN. Outra sugestão, é um tutorial no site ensinando a criar plugins, do básico mesmo. Até agora não encontrei nada na internet, somente alguns slides teóricos, mas que na prática não tem muita utilidade. Acredito que deve ter muita gente com soluções prontas, que poderiam disponibilizar seus plugins e ajudar a estender mais ainda o framework.

  20. Silas Cardoso 03/07/2015 at 22:48 #

    Mas uma coisa, eu vi o Bronx falando a respeito dos construtores, e na documentação também ensina a declarar esses construtores, mas eu estou injetando meus DAO’s nos Controladores, sem utilizar nenhum tipo de construtor e funciona. Isso é normal?

    Eu só faço isso e funciona muito bem:

    @Controller
    public class Usuario Controller {

    @Inject
    private UsuarioDAO dao;

    public salvar(Usuario u) {
    dao.salvar(u);
    }
    }

    E no UsuarioDAO sem construtores também, bem simples, apenas inject no EntityManager:

    @RequestScoped
    public class UsuariosDAO {

    @Inject
    private EntityManager manager;

    public void salvar(Usuario usuario) {
    manager.persist(usuario);
    }
    }

  21. Rodrigo Turini 06/07/2015 at 12:39 #

    Oi Silas, tudo bem? Legal que está gostando do framework. Já estamos trabalhando nesse ponto de deixar mais fácil criar um projeto do zero, tem até uma issue pra quem quiser trackear: https://github.com/caelum/vraptor4/issues/963. Outra opção bem legal agora é o setupmyproject.com (é bem simples de usar). Muito boa sua sugestão sobre criar plugins, se quiser, abre uma issue lá no nosso github. Quanto ao ponto do construtor, é normal fazer injeção direta sim (field injection). Mas normalmente recomendamos usar o construtor pela facilidade de mockar nos testes, etc. Grande abraço

Deixe uma resposta