---
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.0com.rsaraiva.labsevents1.0wareventsUTF-8br.com.caelumvraptor4.0.0.Finalbr.com.caelum.vraptorvraptor-javatime4.0.0.Finaljstljstl1.2org.hibernatehibernate-entitymanager4.3.5.Finalprovidedjavax.injectjavax.inject1providedjavaxjavaee-web-api7.0providedorg.apache.maven.pluginsmaven-compiler-plugin3.11.81.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/ExampleDScom.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}
~~~
Cookbook originalmente postado em [rsaraiva.com](http://rsaraiva.com)