--- title: Construindo uma Aplicação Web com Java 8 e VRaptor 4 no Wildfly --- # Construindo uma Aplicação Web com Java 8 e VRaptor 4 no Wildfly ## por Rubens Saraiva Há pouco mais de dois meses acompanhamos o lançamento do novo Java 1.8, cheio de novidades e novas APIs. Da mesma forma, e quase na mesma época, chegou a versão 4 do VRaptor, framework brasileiro que tem sido cada vez mais utilizado não só no Brasil, como em outros lugares do mundo. O VRaptor 4 foi totalmente modificado para usar o CDI em sua engine de Injeção de Dependências. Isso torna o framework totalmente aderente à plataforma Java Enterprise Edition (JavaEE). Neste post irei mostrar como construir uma aplicação VRaptor 4, usando recursos do novo Java 8 e rodando no WildFly 8, o novo aplication server da JBoss que implementa Java EE 7. Em relação ao banco de dados, a aplicação usará o datasource padrão do Wildfly que usa o HSQLDB Database. O código da aplicação completa está disponível [aqui](http://github.com/rsaraiva/v4_wildfly_jta). Para começar, crie um projeto Web com Maven utilizando sua IDE preferida. Abra o arquivo de configuração do Maven, `pom.xml` e inclua as dependências contidas no arquivo abaixo. ~~~ #!xml 4.0.0 com.rsaraiva.labs events 1.0 war events UTF-8 br.com.caelum vraptor 4.0.0.Final br.com.caelum.vraptor vraptor-javatime 4.0.0.Final jstl jstl 1.2 org.hibernate hibernate-entitymanager 4.3.5.Final provided javax.inject javax.inject 1 provided javax javaee-web-api 7.0 provided org.apache.maven.plugins maven-compiler-plugin 3.1 1.8 1.8 ~~~ A primeira dependência é a do novo VRaptor 4, versão final. Na sequência, incluimos o plugin `vraptor-javatime` que faz o VRaptor reconhecer todos os tipos da nova api de datas. Depois vem a dependência da JSTL para trabalharmos nas JSPs, o hibernate, a lib do CDI e pro fim, a lib do Java EE 7. Na tag plugins, definimos que queremos utilizar Java 8 na construção da aplicação. Agora vamos criar nosso modelo - uma simples entidade para representar Eventos. ~~~ #!java @Entity public class Event implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private LocalDate date; private String description; public Event() { } public Event(String description, LocalDate date) { this.description = description; this.date = date; } // gets and sets } ~~~ Veja que o atributo date é do tipo `LocalDate`, classe da nova api de Datas do Java 8. Mas para isso ser possível, é necessário criar um Converter da JPA, já que a JPA 2.1 ainda não suporta os tipos da nova Date and Time API. ~~~ #!java @Converter(autoApply = true) public class LocalDatePersistenceConverter implements AttributeConverter { @Override public Date convertToDatabaseColumn(LocalDate entityValue) { return (entityValue == null) ? null : Date.valueOf(entityValue); } @Override public LocalDate convertToEntityAttribute(Date databaseValue) { return databaseValue.toLocalDate(); } } ~~~ Este converter deve ser registrado no `persistence.xml` conforme abaixo. ~~~ #!xml java:jboss/datasources/ExampleDS com.rsaraiva.labs.vraptor4.jpa.LocalDatePersistenceConverter ~~~ Agora vamos criar um `Service` que sabe criar um novo evento e listar todos os eventos. Perceba a integração com JavaEE pelo uso das anotações `@Stateless` e `@PersistenceContext`. ~~~ #!java @Stateless public class EventService { @PersistenceContext private EntityManager em; public void persist(Event event) { em.persist(event); } public List findAll() { return em.createQuery("select e from Event e order by e.description").getResultList(); } } ~~~ Agora usaremos o CDI para injetar o service no controller do VRaptor. ~~~ #!java @Controller public class EventController implements Serializable { @Inject private EventService service; @Inject private Result result; @Get("/events") public void event() { result.include("events", service.findAll()); } @Post public void add(Event event) { service.persist(event); result.redirectTo(this).event(); } } ~~~ Nosso controller possui dois métodos. O primeiro usa `EventService` para consultar todos os eventos cadastrados e inclui a lista no contexto da JSP. O segundo recebe o post do formulário da JSP e persiste o evento no banco de dados. Enfim, devemos criar a jsp com a lista de eventos e o formulário de cadastro. ~~~ #!jsp <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> Events

Events

${item.id} ${item.description} ${item.formattedDate}

Description: Date
~~~ Cookbook originalmente postado em [rsaraiva.com](http://rsaraiva.com)