CDI, MVC e outras novidades do Java EE 8

CDI, MVC e outras novidades do Java EE 8
rodrigo.turini
rodrigo.turini

Compartilhe

Estamos acompanhando de perto as novidades do Java EE 8, e recentemente excelentes atualizações foram divulgadas. O lançamento do primeiro draft do CDI 2.0 é uma delas, seguida de novidades no status do MVC 1.0, JSON-P, JMS 2.1, entre outras. Aqui vão algumas delas:

CDI 2.0: Melhorias na API de Eventos e suporte para Java SE

Nessa nova versão, a API de eventos ganhou diversas melhorias, como uso assíncrono e ordenação -- duas features bastante solicitadas pela comunidade. Na prática, o exemplo que utilizamos nesse post sobre eventos do CDI poderia ficar assim:

 public class FinalizaCompra {

    @Inject private Event<Compra> eventoCompra;

public void finalizaCompra() {        Compra compra = new Compra(produto, cliente);        eventoCompra.fireAsync(compra);     } } 
Banner de divulgação da Imersão IA da Alura em colaboração com o Google. Mergulhe em Inteligência artificial com a Alura e o Google. Serão cinco aulas gratuitas para você aprender a usar IA na prática e desenvolver habilidades essenciais para o mercado de trabalho. Inscreva-se gratuitamente agora!

A classe FinalizaCompra notifica assíncronamente que o evento aconteceu, enquanto outras classes, como a Estoque, poderão observar esse evento -- também assíncronamente.

 public class Estoque {

    public void reservaMercadoria(@ObservesAsync Compra compra) { // reserva produto no estoque     } } 

Legal, não é? Outro ponto é que se estivermos trabalhando de forma síncrona, e por alguma necessídade de regra de negócio precisarmos que a classe Notificacoes seja a ultima a observar o evento de compra, podemos priorizar toda ordem de execução:

 public class Estoque {

    public void reservaMercadoria(@Observes @Priority(1) Compra compra) { // reserva produto no estoque     } }

public class Notificacoes {

    public void enviaNotificacao(@Observes @Priority(2) Compra compra) { // envia email, sms, notificando a campra     } } 

Se quiser, você pode ver mais detalhes sobre o funcionamento assíncrono e ordenação de observers no capítulo de eventos da nova versão da spec. Muitas dessas novidades serão aplicadas e suportadas no VRaptor 4, que tem sua nova versão totalmente integrada ao CDI. Vale comentar que todo o fluxo de uma request do VRaptor é tratado com eventos do CDI!

Por fim, seria injusto falar do CDI 2.0 sem falar do suporte ao Java SE. Utilizando a classe CDI, que já conhecemos nesse outro post do CDI 1.0, juntamente com a iterface CDIProvider, agora podemos fazer:

 public static void main(String... args) { try(CDI<Object> cdi = CDI.getCDIProvider().initialize()) { // inicia o container do CDI Estoque estoque = cdi.select(Estoque.class).get(); estoque.reservaMercadoria(new Compra("Livro da CDC")); } // container stopado automaticamente depois do bloco do try } 

MVC 1.0: Novos recursos e melhorias na API de Validação

O MVC também recebeu novos recursos desde nosso último post, em especial um mecanismo de proteção CSRF (Cross-Site Request Forgery). Entre outras variações, você pode ativar o recurso globalmente pela sua classe Application.

 @ApplicationPath("mvc") public class MvcApplication extends Application {

@Override public Set<Class<?>> getClasses() { final Set<Class<?>> set = new HashSet<>(); set.add(ProdutoController.class); return set; }

@Override public Map<String, Object> getProperties() { final Map<String, Object> map = new HashMap<>(); map.put(Csrf.ENABLE\_CSRF, Boolean.TRUE); return map; } } 

Feito isso, todas as requisições de POST para o ProdutoController serão protegidas, com controle de um token que deve ser enviado pelo formulário da view:

 <form action="/produtos/adiciona" method="post"> <input type="submit" value="Click here"/> <input type="hidden" name="${csrf.name}" value="${csrf.token}"/> </form> 

A API de validação também tem sido o foco das mudanças mais recentes. Muito ainda está sendo discutido, mas por enquanto, você já pode imaginar o método adiciona sendo validado assim:

 @Controller @Path("/produtos") public class ProdutoController {

@Inject private BindingResult result;

@POST @ValidateOnExecution(type = ExecutableType.NONE) public Response adiciona(@Valid @BeanParam Produto produto) { if (result.isFailed()) { // mostra mensagens de validação, redireciona, etc } // adiciona produto no banco, etc etc } } 

E muito mais novidades!

Essas são apenas algumas das muitas novidades e atualizações que nos esperam. O Java EE está previsto só pro final do ano que vem, próximo ao JavaOne San Francisco 2016, mas desde já você pode e deve contribuir com testes, idéias, reports de bugs entre outros. O primeiro draft do CDI 2.0, assim como do MVC 1.0, e diversas outras especificações já estão disponíveis para download. E você, que outras novidades espera no Java EE 8? Já tem testado alguma delas?

Veja outros artigos sobre Programação