Você está na página 1de 35

Assine agora e tenha acesso a

todo o contedo da DevMedia:


www.devmedia.com.br/mvp

Edio 55 2015 ISSN 2173625-4

Fale com o Editor!


Atendimento ao leitor
EXPEDIENTE A DevMedia possui uma Central de Atendimento on-line, onde voc muito importante para a equipe saber o que voc est achando da revista:
que tipo de artigo voc gostaria de ler, que artigo voc mais gostou e qual
pode tirar suas dvidas sobre servios, enviar crticas e sugestes e
artigo voc menos gostou. Fique a vontade para entrar em contato com os
falar com um de nossos atendentes. Atravs da nossa central tambm editores e dar a sua sugesto!
Editor possvel alterar dados cadastrais, consultar o status de assinaturas Se voc estiver interessado em publicar um artigo na revista ou no site
e conferir a data de envio de suas revistas. Acesse www.devmedia. Easy Java Magazine, entre em contato com o editor, informando o ttulo e
Eduardo Spnola (eduspinola@gmail.com)
com.br/central, ou se preferir entre em contato conosco atravs do mini-resumo do tema que voc gostaria de publicar:
telefone 21 3382-5038.
Consultor Tcnico Diogo Souza (diogosouzac@gmail.com)
Publicidade
publicidade@devmedia.com.br 21 3382-5038 Eduardo Oliveira Spnola
Produo
eduspinola.wordpress.com
Jornalista Responsvel Kaline Dolabella - JP24185 Anncios Anunciando nas publicaes e nos sites do Grupo DevMedia,
voc divulga sua marca ou produto para mais de 100 mil desenvolvedores @eduspinola / @Java_Magazine
Capa e Diagramao Romulo Araujo de todo o Brasil, em mais de 200 cidades. Solicite nossos Media Kits, com
detalhes sobre preos e formatos de anncios.

Sumrio
04 - JavaFX 8: Uma introduo arquitetura e s novidades da API
[ Daniel Assuno Faria de Menezes ]

Artigo no estilo Soluo Completa

14 - Introduo Arquitetura de Microservices com Spring Boot


[ Marcos Alexandre Vidolin de Lima ]

Contedo sobre Boas Prticas

24 - Hibernate Validator: como validar objetos e ter mais controle sobre os dados
[ Carlos Alberto Silva ]
JavaFX 8: Uma introduo arquitetura e s novidades da API

JavaFX 8: Uma introduo


arquitetura e s
novidades da API
Veja neste artigo um histrico sobre o JavaFX, os
novos recursos da verso 8 e como utiliz-lo na
prtica

D Fique por dentro


esde a verso 1.2 do Java j existiam dois tipos de
bibliotecas grficas: AWT e Swing. A AWT foi
a primeira API destinada a interfaces grficas Este artigo apresentar o JavaFX, uma API do Java utilizada para a
a ser criada e, mais tarde, foi superada pelo Swing, que construo de interfaces ricas e de fcil usabilidade por parte do usu-
trouxe diversos benefcios em relao a seu antecessor. rio. Essa promissora ferramenta conta com todos os recursos que a
Em sua grande maioria, as bibliotecas de criao de linguagem Java oferece, incluindo o fato de ser multiplataforma. Apre-
interfaces grficas so simples de serem utilizadas. sentaremos tambm as camadas da arquitetura do JavaFX, detalhando
O obstculo inicial fica por conta da familiarizao com como cada uma contribui para a criao do layout da aplicao, alm
a sintaxe da linguagem e o grande leque de componentes de mostrar as novidades da verso 8 e exemplos prticos de como
disponveis. usufruir dessa poderosa e verstil soluo.
Com o intuito de agregar mais valor s interfaces de
aplicativos desktop, o JavaFX foi anunciado em maio de
2007, no JavaOne, tendo sua primeira release lanada O desenvolvimento de aplicaes em JavaFX pode fazer uso de
no dia 4 de dezembro de 2008. Nas verses iniciais, qualquer biblioteca Java, acessar recursos nativos do sistema ou se
chamada de JavaFX Script, os desenvolvedores faziam conectar a aplicativos de middleware baseados em servidor. Essa
uso de uma tipagem esttica, verificada em tempo de possibilidade se d pelo fato do JavaFX estar totalmente integrado
compilao, junto a uma linguagem declarativa para ao Java Runtime Environment (JRE) e ao Java Development Kit (JDK),
construir as interfaces. Aps a verso 2.0, a tecnologia sendo capaz de executar aplicaes que o adotem nas principais
passou a ser uma biblioteca do Java, podendo usufruir plataformas desktop (Linux, Mac OS X e Windows). Alm disso,
do cdigo nativo para o desenvolvimento das aplicaes, a partir da verso 8 as plataformas ARM tambm passaram a
e a partir da verso 7 update 6, passou a ser distribuda ser suportadas, aumentando a versatilidade da API com o uso
nas instalaes da linguagem, deixando de ser necess- em sistemas embarcados, como PDAs, dispositivos mveis ou
rio baixar e instalar como uma soluo externa. mquinas com fins industriais.
A API JavaFX usada para a criao de aplicaes Dentre os vrios recursos disponveis esto o uso de compo-
RIA (Rich Internet Application) que se comportam de nentes nativos, grficos 2D e 3D, efeitos, animaes, msicas e
maneira consistente em todas as plataformas, no sendo vdeos, proporcionando uma vasta opo de funcionalidades
necessrio recompilar o cdigo fonte para ser executada para a construo do layout da aplicao. Para facilitar a criao
em diferentes JVMs, desde que estas estejam na mesma e customizao de interfaces, os desenvolvedores contam com o
verso na qual o cdigo foi compilado. O termo RIA FXML, uma linguagem baseada em XML capaz de manipular
usado para descrever Aplicaes Ricas para a Internet, componentes usando HTML e CSS.
ou seja, aplicaes que so executadas em ambiente web, Apesar de muitos desenvolvedores preferirem criar e customizar
mas que possuem caractersticas similares a softwares a interface atravs do FXML, outros acham mais fcil o uso de
desenvolvidos para execuo em ambientes desktop. uma ferramenta grfica. Pensando nisso, a Oracle disponibiliza

4 Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia


uma ferramenta bastante intui-
tiva, chamada Scene Builder, que
auxilia a criao e a manuten-
o do cdigo fonte do FXML,
aumentando a produtividade
e possibilitando a visualizao
das telas no decorrer do desen-
volvimento.
O uso do Scene Builder muito
indicado em casos onde o de-
senvolvedor deseja conseguir Figura 1. Arquitetura do JavaFX
um rpido feedback e/ou no
est familiarizado com as tags botes. Diante disso, caso uma propriedade de estilo seja aplicada
FXML. A partir dele gerado um cdigo simples e claro, possvel ao painel, os campos abaixo na hierarquia, neste caso os botes,
de alterar em qualquer editor de texto ou XML, no engessando iro receber as mesmas caractersticas atribudas ao pai.
o uso ferramenta em outras etapas do projeto. Para a customizao da interface, os componentes podem receber
Neste artigo ser apresentada uma viso geral da arquitetura listeners de eventos e efeitos. Dentre as possibilidades de efeitos,
da API JavaFX e seus principais componentes, detalhando-os e vale citar o focus, blur e shadow, e entre os eventos, podemos utilizar o
mostrando alguns exemplos na prtica. click do mouse, a mudana de campo ou de valores, entre outros.

Nota As APIs pblicas do Java e suas ferramentas


Presente em todos os nveis da arquitetura, as APIs do JDK
Desde o lanamento da verso 2.0 possvel integrar o Scene Builder s principais IDEs Java, como
apoiam o desenvolvimento das aplicaes, possibilitando liber-
Eclipse, NetBeans e IntelliJ. Com esta ferramenta fica mais fcil utilizar os diversos componentes
dade e flexibilidade na construo de solues rich client. Essa
e controles nativos do JavaFX para composio das telas, alm de possibilitar a incluso de
integrao entre os melhores recursos do Java e as funcionalidades
componentes de terceiros ou criar novos componentes.
do JavaFX traz as seguintes vantagens:
O uso de recursos como generics, anotaes e multithreading;
A arquitetura Facilidade para os desenvolvedores web utilizarem o JavaFX a
A arquitetura do JavaFX composta por vrios componentes partir de outras linguagens dinmicas baseadas na JVM, como
que fornecem uma ampla variedade de funcionalidades, como Groovy e Scala;
grficos, animaes e recursos multimdia. Esses componentes Capacidade de extenso das bibliotecas nativas, possibilitando
disponibilizam uma maneira transparente e verstil de projetar a especializao de funcionalidades, componentes e eventos;
interfaces ricas com diversos eventos, efeitos e diferentes modos Uso de listeners e observables, conectando os componentes de
de customizao do layout. interface ao modelo de negcio, refletindo assim o estado dos
As camadas da arquitetura so apresentadas na Figura 1. Nela dados entre as camadas.
podemos verificar os nveis que esto mais prximos ao usurio
(mais acima), at as bibliotecas de renderizao: Java 2D, OpenGL Sistema grfico
e D3D, mais prximas JVM e aos recursos da mquina. Ademais, Visando aprimorar a experincia do usurio com as interfaces,
importante notar que a API pblica do Java (JDK API Libraries o sistema de renderizao do JavaFX foi criado para suportar
& Tools) est acessvel a todos os nveis, facilitando seu uso por animaes em duas e trs dimenses. Essa renderizao reali-
todos os recursos disponveis. zada graas a dois pipelines, o Prism e o Quantum Toolkit, que
gerenciam os recursos do sistema operacional e da mquina.
Scene Graph O Prism responsvel por processar as tarefas de renderiza-
O Scene Graph uma estrutura em rvore que representa a o de imagens e animaes utilizando os recursos do sistema
interface grfica das aplicaes JavaFX. Essa rvore composta por operacional, como o OpenGL e o DirectX. J o Quantum Toolkit
ns, onde cada um representa um componente visual que compe gerencia a interao entre as tarefas do Prism junto ao Windowing
o layout. Um n formado por trs atributos: um identificador, Toolkit, ferramenta que gerencia os recursos de janela do sistema
uma configurao de estilo e um limite de rea. Alm disso, cada operacional.
n pode ter apenas um pai e um ou mais filhos.
Essa arquitetura em hierarquia facilita o desenvolvimento das Glass Window Toolkit
interfaces, j que ao aplicar um recurso ou uma propriedade de O Glass Window Toolkit, ou somente Glass, responsvel por
estilo em um n, seus filhos herdaro essas configuraes. Para mostrar as janelas (Stage, Popup, etc.) e gerenciar a fila de eventos
exemplificar, podemos imaginar um painel que encapsula dois do JavaFX. Estes eventos, no entanto, so gerenciados de formas

Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia 5


JavaFX 8: Uma introduo arquitetura e s novidades da API

diferentes em cada sistema operacional. Em plataformas como o trocas de estilo dinamicamente, aprimorando assim a interao
Mac OS, por exemplo, h chamadas de callback sempre que um do sistema com o usurio.
evento lanado, e nestes casos, o Glass recupera esses callbacks Esse componente baseado na especificao 2.1 do CSS. Logo,
nativos, transforma-os em eventos do JavaFX e os adiciona fila de pode ser interpretado por qualquer ferramenta de leitura de CSS,
eventos. No Windows, por sua vez, necessrio gerenciar essa fila inclusive as que no suportam as extenses do JavaFX. Essa carac-
manualmente, capturando o evento nativo do SO e adicionando terstica possibilita a unio de cdigo CSS a JavaFX e HTML em um
o evento equivalente do JavaFX na fila. mesmo arquivo, opo que veremos no exemplo deste tutorial.

Recursos multimdia Componentes de controle da interface


Os recursos multimdia do JavaFX esto disponveis atravs As interaes com a interface no JavaFX so realizadas atravs de
da API javafx.scene.media, onde foram projetados para serem diversos tipos de componentes. Dentre eles, podemos citar: Button,
escalveis e terem um comportamento consistente em todas as Toggle Button, Hyperlink, Checkbox, Radio Button, Menu Buttons,
plataformas. O JavaFX capaz de suportar mdias visuais e de ListView, etc., todos presentes no pacote javafx.scene.control.
som a partir de vrias extenses, como mp3, AIFF, wav e flv. As classes de controle so adicionadas aplicao como ns
do Scene Graph, sendo todas extenses da classe Node. Dessa
Web Engine forma podemos aplicar propriedades de estilo e efeitos em todos
Os recursos para deploy e apresentao de aplicaes JavaFX na os componentes, por exemplo, um boto pode ter o efeito de opa-
web so baseados no WebKit, uma engine open source de renderiza- cidade modificado, alterando o destaque do elemento no layout.
o de pginas web nos navegadores. Presente em vrios browsers, Esse efeito demonstrado na Figura 3, onde o boto esquerda
como o Safari da Apple e o Chrome do Google, essa ferramenta exibido com o valor de opacidade 1.0, o do centro com 0.8 e o da
oferece suporte a CSS, JavaScript, DOM, HTML5 e SVG. direita com o valor de opacidade 0.5.
Para a utilizao no JavaFX, essa ferramenta embarcada que
proporciona a interao entre o backend da aplicao e as pginas
web, foi implementada em duas classes: WebEngine e WebView,
apresentadas na Figura 2. A classe WebEngine disponibiliza
todas as funcionalidades necessrias para o uso de pginas web, Figura 3. Boto com diferentes valores de opacidade
como o envio de formulrios, uso de botes e navegao. A classe
WebView, por sua vez, se responsabiliza pela integrao entre o Transformaes em 2D e 3D
contedo web e o layout, alm de prover os campos e mtodos Cada componente presente no Scene Graph pode ter sua posi-
para a aplicao de efeitos e transformaes. o transformada em coordenadas x, y e z. Essa transformao
possibilita movimentar os componentes na tela, seja mudando a
posio, girando o componente, entre outras possibilidades. As
transformaes so realizadas atravs das seguintes classes do
pacote javafx.scene.transform:
Translate Movimenta um n de um ponto a outro. Por exemplo,
para movimentar o componente da esquerda para a direita, basta
aumentar o valor da coordenada X, para movimentar o compo-
nente na vertical, basta alterar o valor da coordenada Y;
Scale Redimensiona um n para aparentar ser maior ou me-
nor, dependendo do fator de escala. Essa transformao aplica o
fator de escala (a quantidade que o componente deve aumentar
ou diminuir) em todas as coordenadas;
Shear Gira um eixo de forma que o x e o y nunca fiquem per-
pendiculares, ou seja, que os eixos nunca se cruzem, deslocando os
valores das coordenadas pelo multiplicador especificado no giro;
Rotate Gira um n em relao a um determinado eixo, ou seja,
Figura 2. Comunicao entre as classes WebView e WebEngine junto aos ns do Scene Graph define um eixo no qual o componente ir girar e aplica os fatores
de deslocamento nos demais, girando o componente.
JavaFX Cascading Style Sheets
O JavaFX CSS fornece a capacidade de personalizao dos es- Efeitos visuais
tilos da interface do usurio sem alteraes em qualquer cdigo O desenvolvimento de interfaces ricas e detalhadas em conjunto
Java. Para isso, o CSS pode ser aplicado a qualquer n no Scene com a utilizao de efeitos visuais aprimora e torna a interface
Graph e pode ser alterado em tempo de execuo, possibilitando mais atraente e ldica para o usurio, facilitando o aprendizado

6 Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia


e simplificando seu uso no dia a dia. Pensando nisso, o JavaFX Suporte a Rich Text: Para aumentar as opes de persona-
disponibiliza diferentes efeitos. Dentre eles, podemos citar: lizao da interface, foi adicionado o suporte Rich Text. Esse
Drop shadow Permite a renderizao de um componente recurso possibilita a customizao de palavras individualmente
atrs de outro, deixando o foco do layout no componente mais atravs de estilos CSS, a capacidade de escrever da direita para
visvel; esquerda (Bidirectional Text) ou o uso de efeitos como sombrea-
Reflection Essa opo d a iluso do item estar refletido na mento nos textos;
tela, simulando o efeito do reflexo na gua; Suporte ao OpenGLES2: Outro recurso adicionado foi o suporte
Lighting Simula uma fonte de luz que brilha sobre determi- ao OpenGLES2, API baseada em OpenGL para tratamento de
nado contedo, dando ao objeto uma aparncia mais realista. grficos 2D e 3D em sistemas embarcados, como consoles, PDAs,
smartphones e veculos. O OpenGLES2 oferece uma interface
Principais recursos entre o software e a acelerao grfica por meio de profiles, que
Alm de incorporar todos os recursos da linguagem, como ex- so customizados com o intuito de pr-processar diretrizes de
presses Lambda e default methods, novidades do Java 8, a verso 8 controle, otimizando a renderizao de acordo com o ambiente
do JavaFX inclui outras vrias novidades. A seguir apresentamos onde o recurso ser processado;
uma descrio das principais: Novas funes grficas com recursos em 3D: Os novos
Integrao com Swing: O uso de componentes da biblioteca componentes shape3D (Box, Cylinder, MeshView e Sphere),
Swing no JavaFX mais uma opo para criao de interfaces SubScene, Material, PickResult, LightBase (AmbientLight e
viabilizada na release 2.0. A partir da verso 8 do JavaFX, o oposto PointLight) e SceneAntialiasing foram adicionados biblioteca
tambm possvel, ou seja, componentes criados em JavaFX agora grfica JavaFX 3D;
podem ser empregados em aplicaes Swing. Isso possvel com Suporte arquitetura ARM: O JavaFX agora est disponvel
a utilizao da classe SwingNode; para a plataforma ARM. O Java Development Kit para plataformas
Fuso do Event Dispatch Thread e do JavaFX Application ARM inclui a base, os grficos e os componentes de controle do
Thread: Na nova verso do JavaFX, o Event Dispatch Thread, JavaFX. Muitos fabricantes tendem a criar softwares embarcados
usado pela biblioteca Swing, se fundiu ao JavaFX Application na linguagem C, porm o Java traz diversas vantagens, como:
Thread. Essa juno reduziu consideravelmente a quantidade de - Com a orientao a objetos as entidades podem ser repre-
cdigo necessria para criar aplicaes com componentes FX sentadas com mais naturalidade, como os sensores e outras
e Swing; representaes de objetos do cliente, aumentando a manute-
O novo tema: Modena: Um novo tema foi introduzido. A apa- nibilidade e produtividade;
rncia de Modena renova o visual dos componentes e possibilita - Menos propenso a erros que o C, a exemplo dos ponteiros;
a criao de interfaces com cores mais vivas e atualizadas, como - Sistemas portveis. No precisam ser recompilados para
pode ser verificado na Figura 4; serem executados em outras plataformas ou sistemas opera-
cionais;
- Suporte a vrias bibliotecas independentes do sistema
operacional, incluindo acesso ao banco de dados e componentes
de interface grfica.
Novas funes para a classe WebView. Esta classe foi atualizada
e recebeu novas funes e melhorias, a saber:
- Renderizao de contedo HTML;
- Obteno do histrico da web;
- Execuo de comandos JavaScript;
- Comunicao entre JavaScript e JavaFX;
- Gerenciamento de janelas e pop-ups.
Novos componentes de controle: Dois novos componentes de
controle para interfaces grficas foram adicionados, o DatePicker
e o TreeTableView. O DatePicker permite que o usurio entre com
a data como um texto ou selecione uma data de um calendrio que
mostrado como um pop-up. O calendrio se baseia no padro
ISO-8601 ou em qualquer outra classe cronolgica definida no
pacote java.time.chrono. J TreeTableView um componente
que permite visualizar um nmero ilimitado de linhas de da-
dos, mostrando o resultado em uma tabela com paginao. Esse
componente unifica as funcionalidades das classes TreeView e
Figura 4. Novo layout do tema Modena em diferentes sistemas operacionais TableView.

Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia 7


JavaFX 8: Uma introduo arquitetura e s novidades da API

Exemplos de aplicaes com JavaFX


O desenvolvimento de aplicaes JavaFX, assim como ocorre com
aplicaes desktop e web, pode ser simplificado com o uso de IDEs
que disponibilizam recursos para a implementao do cdigo,
como o caso do NetBeans e Eclipse. Para a implementao dos
exemplos deste artigo, optamos pelo Eclipse com o plugin e(fx)
clipse, que pode ser configurado seguindo o tutorial disponibi-
lizado em sua pgina (veja o endereo indicado na seo Links).
Alm disso, necessrio ter instalado o JDK 8, que j contempla
a verso equivalente do JavaFX.
Feito isso, para apresentar alguns recursos do JavaFX, foram
projetadas duas aplicaes simples: uma que utiliza recursos para
aplicaes web e demonstra algumas funcionalidades em um
mapa online, baseada na API do Google Maps; e outra que mostra
como construir objetos em 3D e faz uso de animaes.

Google Maps com recursos em JavaScript


Nosso primeiro exemplo mostrar como implementar os recur-
sos para criao e renderizao de pginas web a partir do JavaFX,
atravs das classes WebView e WebEngine. Para isso, usaremos
tambm algumas funcionalidades da API do Google Maps, junto
visualizao de um mapa, com JavaScript e HTML. O mapa Figura 5. Criao de um projeto do tipo JavaFX pelo e(fx)clipse
possibilitar a realizao de pesquisas de endereo, aproximar
ou afastar o zoom e alterar a baselayer (que define como o mapa
ser exibido).
Para o desenvolvimento do exemplo, primeiramente precisamos
criar um projeto do tipo JavaFX pelo e(fx)clipse. Isso pode ser feito
acessando: File > New > Project. Logo aps, no wizard que ser
aberto, selecione JavaFX > JavaFX Project (vide Figura 5). A prxima
etapa configurar o projeto, definindo seu nome e escolhendo a
verso do Java/JavaFX que ser usada (vide Figura 6).
Configurado o projeto, partiremos para a implementao, onde
vamos criar quatro arquivos. Alm do .java, onde ficar o cdigo
JavaFX, criaremos um arquivo JavaScript, que concentrar as
funes de comunicao com a API do Google Maps, um arquivo
CSS, que customizar o layout dos componentes usados, e um
arquivo HTML, que ir definir o layout onde o mapa ser exibido
e centralizar as chamadas das funes JavaScript e propriedades
de estilo CSS.
O arquivo que apresenta o cdigo mais simples o HTML, que no
nosso exemplo foi chamado de googleMap.html (veja a Listagem 1).
Em seu cdigo, temos uma referncia ao arquivo que contempla o
CSS usado para customizar o layout do projeto e duas referncias
para dois links JavaScript. Um desses links est relacionado API
de mapas do Google, que est disponvel na web e pode ser aces-
sada pelo endereo http://maps.google.com/maps/api/js?sensor=false.
O outro link, por sua vez, faz referncia ao arquivo JavaScript
que contempla a funo initialize(), responsvel por inicializar
a instncia do mapa. Essa funo chamada no atributo onload
da tag body do HTML, ou seja, o cdigo executado assim que
o HTML renderizado. Ademais, como podemos verificar, no
contedo do body temos somente uma tag div, que ser utilizada
para renderizar o mapa. Figura 6. Configurao de um projeto JavaFX pelo e(fx)clipse

8 Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia


Listagem 1. Cdigo HTML que define o layout do exemplo. Listagem 2. Cdigo da funo initialize(), responsvel por inicializar o mapa e suas
propriedades.
<!DOCTYPE html>
<html> function initialize() {
<head> var latlng = new google.maps.LatLng(-19.9327448,-43.9300262);
<meta name=viewport content=initial-scale=1.0, user-scalable=no />
<link rel=stylesheet type=text/css href=googleMap.css> var myOptions = {
<script type=text/javascript zoom: 14,
src=http://maps.google.com/maps/api/js?sensor=false /> center: latlng,
<script type=text/javascript src=mapFunctions.js /> mapTypeId: google.maps.MapTypeId.ROADMAP,
</head> mapTypeControl: false,
<body onload=initialize()> navigationControl: false,
<div id=map_canvas style=width: 100%; height: 100%></div> streetViewControl: false,
</body> backgroundColor: #666970
</html> };

document.geocoder = new google.maps.Geocoder();


A funo initialize() foi implementada no arquivo mapFunctions.
document.map = new google.maps.Map(
js e define as propriedades do mapa, configurando assim como document.getElementById(map_canvas),myOptions);
ele ser apresentado na tela (veja a Listagem 2). Estas definies
document.zoomIn = function zoomIn() {
esto relacionadas basicamente inicializao dos componentes var zoomLevel = document.map.getZoom();
do mapa do Google que sero utilizados. No nosso exemplo, if (zoomLevel <= 20) document.map.setZoom(zoomLevel + 1);
criamos a varivel myOptions para especificar o ponto central }

onde o mapa ser aberto (a coordenada com os valores de latitude document.zoomOut = function zoomOut() {
e longitude que representam o centro do mapa definida pelo var zoomLevel = document.map.getZoom();
mtodo google.maps.LatLng()), o nvel de zoom que ser inicia- if (zoomLevel > 0) document.map.setZoom(zoomLevel - 1);
}
lizado, a baselayer padro e outras funcionalidades nativas que
podem ser carregadas da API do Google Maps, como o street view document.setMapTypeRoad = function setMapTypeRoad() {
document.map.setMapTypeId(google.maps.MapTypeId.ROADMAP);
e o controle de navegao. Note que a instncia do mapa criada
}
usando o mtodo google.maps.Map(), que recebe como parmetro
a varivel myOptions e o elemento HTML da div, que indica onde document.setMapTypeSatellite = function setMapTypeSatellite() {
document.map.setMapTypeId(google.maps.MapTypeId.SATELLITE);
o mapa ser renderizado no arquivo HTML.
}
A prxima configurao declarada na funo initialize() diz res-
peito s funcionalidades de aproximao e afastamento do mapa, document.setMapTypeHybrid = function setMapTypeHybrid() {
document.map.setMapTypeId(google.maps.MapTypeId.HYBRID);
definidas por zoomIn() e zoomOut(). Essas funes controlam o }
zoom atual, acrescentando ou diminuindo o valor de acordo com
a opo que foi chamada. No caso da funo zoomIn(), o usurio document.setMapTypeTerrain = function setMapTypeTerrain() {
document.map.setMapTypeId(google.maps.MapTypeId.TERRAIN);
notar uma aproximao e maior detalhamento do mapa. J com }
a funo zoomOut(), acontece o contrrio. Outra responsabili-
dade de initialize() a criao das constantes que representam document.goToLocation = function goToLocation(searchString) {
document.geocoder.geocode( {address: searchString},
as opes de baselayer disponveis (Estradas, Satlite, Hbrido e function(results, status) {
Terreno). if (status == google.maps.GeocoderStatus. OK) {
Por fim, initialize() cria a funo para consulta a endereos. Essa document.map.setCenter(results[0].geometry.location);
} else {
funo, de nome goToLocation(), pesquisa a String digitada pelo alert(Erro ao buscar o endereo: + status);
usurio na base de dados de endereos do Google, via servio }
});
da prpria API do Google Maps, usando a classe google.maps
}
.Geocoder(), e caso encontre algum resultado, o ponto central do }
mapa alterado para o novo local.
Outro arquivo que criamos para a implementao do exemplo
foi o googleMap.css, apresentado na Listagem 3. Nele definimos os O ltimo arquivo que implementamos para a construo do
estilos para customizao dos componentes do JavaFX e HTML. projeto foi o GoogleMap.java. Nesse arquivo concentramos todo
As propriedades de CSS disponveis no JavaFX podem ser con- o cdigo JavaFX necessrio para construir o exemplo, utilizando
sultadas na wiki online criada pela Oracle (veja a seo Links). apenas dois mtodos: main() e start().
No nosso exemplo, foram usados atributos de customizao para O mtodo main(), apresentado na Listagem 4, responsvel
as tags html, body e div, que ir renderizar o mapa, e para as apenas por realizar a chamada classe javafx.application.Ap-
propriedades de estilo utilizadas no cdigo do JavaFX, como a plication, ponto de entrada de toda aplicao JavaFX. O incio da
formatao do menu e do mapa. execuo se resume aos seguintes passos:

Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia 9


JavaFX 8: Uma introduo arquitetura e s novidades da API

1. Construo da instncia da respectiva Application.class; para a entrada da String de consulta. Nesse componente, adicio-
2. Chamada ao mtodo init(); namos a mensagem Entre com o endereo atravs do mtodo
3. Chamada ao mtodo start(javafx.stage.Stage). setPromptText(), expondo para o usurio o objetivo do campo.
A pesquisa pelo endereo realizada pelo listener adicionado ao
Listagem 3. Cdigo do arquivo googleMaps.css. componente. Esse listener, assim como o boto da troca de base-
layer, implementa a interface javax.beans.value.ChangeListener,
html {
height: 100%
capturando o evento lanado quando o usurio est digitando no
} inputText da pesquisa, com o auxlio da classe javafx.animation
body { .KeyFrame, e aps um intervalo definido em milissegundos pela
height: 100%;
margin: 0px;
classe javafx.util.Duration, efetua a pesquisa na base de dados
padding: 0px do Google ao executar a funo goToLocation().
} Ainda no mtodo start(), os botes relacionados ao zoomin e
#map_canvas { zoomout foram implementados utilizando a classe javafx.scene.
height: 100%; control.Button, que recebe como parmetro no construtor o label a
background-color: #666970; ser apresentado na interface. Os eventos de clique foram adiciona-
}
dos aos botes atravs do mtodo setOnAction(), que, por sua vez,
.map{ recebe como parmetro uma implementao da interface javafx
-fx-background-color: #666970;
.event.EventHandler, que chama a respectiva funo JavaScript
}
para aumentar ou diminuir o zoom no mapa.
.map-toolbar .button, .map-toolbar .toggle-button, .map-toolbar .label { Com todos os componentes de interface para interao com o
-fx-text-fill: white;
mapa prontos, os agrupamos em um menu, o qual foi definido no
-fx-background-radius: 0;
} exemplo com a classe javafx.scene.control.ToolBar. Em seguida,
esse agrupamento foi adicionado ao javafx.scene.layout.Border-
.map-toolbar{
-fx-base: #505359;
Pane, um componente de layout do JavaFX usado para posicionar
-fx-background: #505359; os itens na tela. O componente do menu foi adicionado no topo,
-fx-shadow-highlight-color: transparent; e a instncia da classe WebView, que mostrar o contedo da
-fx-spacing: 5;
-fx-padding: 4 4 4 4;
pgina web (googleMap.html), foi adicionada no centro da tela.
} O BorderPane ser o n raiz do javafx.scene.Scene (Scene Graph),
a raiz da rvore de componentes do JavaFX.
Listagem 4. Cdigo do mtodo main().
Note ainda que o mtodo start() recebe como parmetro o
/** javafx.stage.Stage, continer de mais alto nvel do JavaFX. Na
* Mtodo main().
instncia de Stage configuramos a janela que ser exibida para
* @param args Argumentos para a execuo
*/ apresentar os componentes especificados pela aplicao, que esto
public static void main(String[] args) { no objeto scene.
Application.launch(args);
}
Ao executar a aplicao, o resultado ser o apresentado na
Figura 7, que mostra a janela com o mapa disponibilizado pelo
servio do Google. Observe na parte superior que temos o campo
J no mtodo start(), vide Listagem 5, implementamos o cdigo para busca por endereo, botes de incremento e diminuio do
do JavaFX. Nele, instanciamos as classes WebView e WebEngine, zoom e opes para a alterao da base layer (estradas, satlite,
responsveis pelas operaes de criao e renderizao dos recur- hbrido e terreno). A partir disso, ao realizar a busca por uma
sos web. Para renderizar o cdigo HTML, chamamos o mtodo localizao, o centro do mapa ser alterado para o endereo
load() da classe WebEngine, passando o arquivo googleMap.html desejado.
como parmetro.
O prximo passo a criao dos botes que realizam a alterao Cubo3D com animao
da baselayer. Em nosso exemplo, cada boto foi criado separa- O segundo exemplo demonstra a criao de um cubo 3D e a
damente, usando a classe javafx.scene.control.ToggleButton, e aplicao do efeito de rotao ao mesmo, fazendo com que ele
ento so agrupados, com a classe javafx.scene.control.Toggle- fique girando na tela. O cubo foi desenhado a partir da criao
Group. O listener para tratar o clique nos botes e realizar a troca de cada lado separadamente, deixando os lados paralelos com a
da baselayer foi feito implementando a interface javax.beans.value mesma cor, o que facilita a visualizao da rotao.
.ChangeListener, identificando qual boto foi acionado e chaman- A implementao desse cdigo foi realizada em um novo pro-
do a respectiva funo criada no arquivo mapFunctions.js. jeto JavaFX, criado no Eclipse exatamente como demonstrado no
A funcionalidade de pesquisa de endereos, por sua vez, foi primeiro exemplo. Para este caso, no entanto, definimos apenas
desenvolvida utilizando a classe javafx.scene.control.TextField um arquivo, a classe de nome Cube3D, que trar o mtodo

10 Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia


Listagem 5. Mtodo start() da classe GoogleMap.

@Override webEngine.executeScript(
public void start(Stage stage) { document.goToLocation(\+searchField.getText()+\));
// Instancia as classes WebView e WebEngine. }
final WebView webView = new WebView(); })
final WebEngine webEngine = webView.getEngine(); );
// Carrega o HTML onde foi criado o mapa do Google inputTextLocation.play();
webEngine.load(this.getClass().getResource(googleMap.html).toString()); }
// Cria os botes para alternar as base layers });
final ToggleGroup baselayerGroup = new ToggleGroup();
final ToggleButton road = new ToggleButton(Road); // Boto de ZoomIn. Aproximando o mapa
road.setSelected(true); Button zoomIn = new Button(Zoom +);
road.setToggleGroup(baselayerGroup); zoomIn.setOnAction(new EventHandler<ActionEvent>() {
final ToggleButton satellite = new ToggleButton(Satellite); public void handle(ActionEvent actionEvent) {
satellite.setToggleGroup(baselayerGroup); webEngine.executeScript(document.zoomIn());
final ToggleButton hybrid = new ToggleButton(Hybrid); }
hybrid.setToggleGroup(baselayerGroup); });
final ToggleButton terrain = new ToggleButton(Terrain);
terrain.setToggleGroup(baselayerGroup); // Boto de ZoomOut. Afastando o mapa
baselayerGroup.selectedToggleProperty().addListener( Button zoomOut = new Button(Zoom -);
new ChangeListener<Toggle>() { zoomOut.setOnAction(new EventHandler<ActionEvent>() {
public void changed(ObservableValue<? extends Toggle> public void handle(ActionEvent actionEvent) {
observableValue, Toggle toggle, Toggle toggle1) { webEngine.executeScript(document.zoomOut());
if (road.isSelected()) { }
webEngine.executeScript(document.setMapTypeRoad()); });
} else if (satellite.isSelected()) {
webEngine.executeScript(document.setMapTypeSatellite()); // Espao horizontal para ajuste no layout
} else if (hybrid.isSelected()) { Region spacer = new Region();
webEngine.executeScript(document.setMapTypeHybrid()); HBox.setHgrow(spacer, Priority.ALWAYS);
} else if (terrain.isSelected()) { // Cria a barra de ferramentas com os controles da view
webEngine.executeScript(document.setMapTypeTerrain()); ToolBar toolBar = new ToolBar();
} toolBar.getStyleClass().add(map-toolbar);
} toolBar.getItems().addAll(new Label(Localizao: ),
}); searchField, zoomIn, zoomOut, spacer, buttonBar);
// Cria um layout do tipo BorderPane
// Barra de botes para que o usurio possa escolher a base layer BorderPane root = new BorderPane();
HBox buttonBar = new HBox(); root.getStyleClass().add(map);
buttonBar.getChildren().addAll(road, satellite, hybrid, terrain); root.setCenter(webView);
// Campo para insero da localizao root.setTop(toolBar);
final TextField searchField = new TextField(); // Atribui o ttulo da aplicao
searchField.setPromptText(Entre com o endereo); stage.setTitle(Google Maps);
searchField.textProperty().addListener(new ChangeListener<String>() { // Cria a scene, definindo o tamanho da janela e a cor de background
public void changed(ObservableValue<? extends String> Scene scene = new Scene(root, 1050, 590, Color.web(#666970));
observableValue, String s, String s1) { stage.setScene(scene);
if (inputTextLocation != null) { // Atribui o arquivo de propriedades CSS.
inputTextLocation.stop(); scene.getStylesheets().add(getClass().getResource(googleMaps.css)
} .toExternalForm());
inputTextLocation = new Timeline(); // Apresenta o stage, n raiz.
inputTextLocation.getKeyFrames().add ( stage.show();
new KeyFrame(new Duration(550), new EventHandler<ActionEvent>() { }
public void handle(ActionEvent actionEvent) {

start() que representa o ponto inicial para execuo de


aplicaes JavaFX. O cdigo desse mtodo pode ser visto
na Listagem 6.
A primeira responsabilidade desse mtodo a instan-
ciao dos pontos geomtricos xAxis e yAxis, que iro
representar as coordenadas X e Y, usadas como base para
a criao dos lados do cubo. Esses pontos geomtricos
foram construdos a partir da classe javafx.geometry
.Point3D.
Para compor o cubo, os seis lados foram criados separada-
mente, e como especificamos que os lados paralelos devem
ter a mesma cor, foram definidas as cores: azul, vermelho
e verde. Em seguida, cada lado foi posicionado de forma
a criar o volume do cubo, o que feito atravs da rotao Figura 7. Aplicao JavaFX usando browser embarcado para acessar recursos do Google Maps

Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia 11


JavaFX 8: Uma introduo arquitetura e s novidades da API

Listagem 6. Cdigo do mtodo start() para o exemplo do Cubo3D.

@Override Rectangle leftFace = createRectangle(Color.RED);


public void start(Stage primaryStage) { leftFace.getTransforms().addAll(
final Point3D xAxis = new Point3D(1, 0, 0); new Rotate(-90, yAxis),
final Point3D yAxis = new Point3D(0, 1, 0); new Translate(0, 0, -CUBE_SIZE)
);
Rectangle bottomFace = createRectangle(Color.BLUE);
Group root = new Group();
Rectangle topFace = createRectangle(Color.BLUE); root.getChildren().addAll(topFace, bottomFace, frontFace,
topFace.getTransforms().addAll(new Translate(0, 0, CUBE_SIZE)); backFace, rightFace, leftFace);
root.relocate(CUBE_SIZE / 2, CUBE_SIZE / 2);
Rectangle frontFace = createRectangle(Color.GREEN);
frontFace.getTransforms().addAll( RotateTransition rotation = new RotateTransition(new Duration(1500), root);
new Rotate(-90, xAxis), new Translate(0, -CUBE_SIZE, 0) rotation.setAxis(new Point3D(1, 1, 1));
); rotation.setFromAngle(0);
rotation.setToAngle(360);
Rectangle backFace = createRectangle(Color.GREEN); rotation.setCycleCount(Transition.INDEFINITE);
backFace.getTransforms().addAll(
new Rotate(90, xAxis), new Translate(0, 0, -CUBE_SIZE) Scene scene = new Scene(root, 2 * CUBE_SIZE, 2 * CUBE_SIZE);
); PerspectiveCamera camera = new PerspectiveCamera(false);
scene.setCamera(camera);
Rectangle rightFace = createRectangle(Color.RED); primaryStage.setScene(scene);
rightFace.getTransforms().addAll( primaryStage.show();
new Rotate(90, yAxis), new Translate(-CUBE_SIZE, 0, 0) rotation.play();
); }

em relao aos eixos X e Y com a classe javafx.scene.transform aplicado. Para isso, criamos mais uma instncia da classe javafx
.Rotate. Com essa transformao (rotao), os lados de mesma .geometry.Point3D, definindo que o movimento de rotao do
cor foram posicionados paralelamente, e juntos, foram dispostos cubo ocorrer no sentido dos trs eixos: X, Y e Z.
de forma a criar a geometria do cubo. O mtodo que concentra a Por fim, criamos uma instncia da classe javafx.scene.Scene,
criao de cada lado foi chamado de createRectangle(), mostrado que representa o Scene Graph. Nesse objeto, definimos o tamanho
na Listagem 7. Esse mtodo cria um retngulo a partir da cor da janela a ser criada para apresentar os componentes a partir
desejada, usando um tamanho fixo de altura e largura. do n raiz, que no nosso exemplo a instncia da classe javafx
.scene.Group. O resultado pode ser visto na Figura 8, que mostra
a imagem do cubo em rotao.
Listagem 7. Cdigo do mtodo createRectangle().

private Rectangle createRectangle(Color color) {


Rectangle retangle = new Rectangle();
retangle.setWidth(CUBE_SIZE);
retangle.setHeight(CUBE_SIZE);
retangle.setFill(color);
return retangle;
}

Com todos os lados do cubo prontos, necessrio agrup-los


em um nico objeto. Com esse objetivo, instanciamos a classe
javafx.scene.Group para representar o cubo como um n, ou seja,
um componente do Scene Graph, que a rvore de componentes
da aplicao. Criado o componente do cubo, de nome root, cada
lado adicionado como um filho do mesmo, e logo aps, o cubo
posicionado na tela atravs do mtodo relocate().
O prximo passo a implementao do efeito de rotao, o que
foi feito atravs da classe javafx.animation.RotateTransition.
Ao instanciar essa classe, passamos no construtor o tempo da
rotao em milissegundos (1500), usando uma instncia da classe
javafx.util.Duration, e o componente do cubo. Com a instncia
da animao de rotao em mos, representada pela varivel
rotation, note que atribumos ainda o eixo no qual o efeito ser Figura 8. Cubo 3D criado com JavaFX

12 Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia


O JavaFX a aposta para a nova gerao de aplicativos rich Links:
client da Oracle. Projetado para oferecer uma aparncia leve e
com otimizao de hardware, o JavaFX permite a implementao Como configurar o e(fx)clipse.
de sistemas com diversas opes de animao e efeitos, o que http://www.eclipse.org/efxclipse/install.html
garante uma interface grfica diferenciada e rica em usabilidade,
e possibilita ainda a preservao do cdigo nativo de aplicaes Viso geral do JavaFX.
http://docs.oracle.com/javase/8/javafx/get-started-tutorial/jfx-overview.htm#JFXST784
j desenvolvidas, o reuso de bibliotecas Java, a conexo com
outras aplicaes de middleware baseadas em servidor, assim
Exemplos online de aplicaes desenvolvidas com JavaFX.
como acessar recursos nativos do sistema. Portanto, vale a pena http://download.oracle.com/otndocs/products/javafx/2/samples/Ensemble/index.html
conferir todos os recursos que essa API disponibiliza e utiliz-la
no seu dia a dia. Adicionando elementos HTML em aplicaes JavaFX.
http://docs.oracle.com/javafx/2/webview/jfxpub-webview.htm
Autor
JavaFX CSS Reference Guide.
Daniel Assuno Faria de Menezes http://docs.oracle.com/javafx/2/api/javafx/scene/doc-files/cssref.html
daniel.afmenezes@gmail.com
Bacharel em Cincia da Computao pela PUC-Minas, Ps-
graduado em Engenharia de Software pela PUC-Minas. Atua
h mais de nove anos com desenvolvimento de software com diversas
linguagens. Entusiasta e apaixonado por tecnologia

Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia 13


Arquitetura de Microservices com Spring Boot na prtica

Arquitetura de Microservices
com Spring Boot na prtica
Aprenda neste artigo os principais conceitos e
desenvolva um microsservio para distribuio de
pacotes de viagens a diferentes clientes de um portal

U
ma das funes mais importantes e desafiado-
ras de um arquiteto de software a definio da Fique por dentro
arquitetura para o sistema a ser desenvolvido.
Iniciada entre as primeiras fases do projeto, esta etapa Este artigo apresenta de forma prtica um dos assuntos que vem
fundamental para o bom andamento do mesmo. Para se ganhando mais destaque entre arquitetos e desenvolvedores de
ter uma noo mais precisa, uma deciso incorreta pode software: o padro de arquitetura microsservios (ou microservices).
ocasionar atrasos na entrega do sistema, comprometer Para isso, exploraremos aqui os principais conceitos, vantagens e
a qualidade, a segurana ou at mesmo inviabilizar o desvantagens, assim como um caso de uso. A partir do contedo
desenvolvimento. exposto o leitor ser capaz de dar os primeiros passos na construo
Dada a importncia dessa fase para a fundao do siste- de sistemas baseados nessa arquitetura na plataforma Java utilizando
ma, inmeros padres de desenvolvimento, frameworks o Spring Boot.
e modelos arquiteturais so elaborados para resolver
problemas comuns utilizando as melhores prticas.
Neste cenrio, um dos padres arquiteturas que mais Na Figura 1 podemos verificar um exemplo de ERP construdo
tem se destacado a arquitetura de microservices, com base numa arquitetura monoltica.
justamente pelos benefcios adquiridos ao adotar esta
soluo. Antes de discutirmos mais detalhes sobre essa
arquitetura, no entanto, precisamos entender outro pa-
dro arquitetural muito utilizado, talvez o mais comum
deles: a arquitetura monoltica.
Portanto, no decorrer do artigo iremos debater sobre
os conceitos introdutrios dos padres de arquitetura
monoltica e de microservice e, de forma prtica, iremos
aplicar esses conceitos para solucionar um problema
elaborado para o caso de uso do artigo, que far uso do
Spring Boot como base.

Aplicaes Monolticas
Sistemas construdos sobre o padro arquitetural
monoltico so compostos basicamente por mdulos
ou funcionalidades agrupadas que, juntas, compem o
software. Como exemplos de aplicaes que fazem uso
do modelo monoltico, podemos citar os sistemas ERP
(Enterprise Resource Planning), como o SAP ou Protheus.
Estes possuem, normalmente, mdulos para controle do
setor financeiro, contbil, compras, entre outros, agrupa-
dos numa nica soluo que acessa o banco de dados. Figura 1. Exemplo de Arquitetura Monoltica

14 Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia


Introduzida a mais tempo que o padro de microservices, a Implantar uma alterao em um servio utilizado por muitos
arquitetura monoltica tambm comumente utilizada no desen- sistemas demanda coordenao e cautela.
volvimento de aplicaes web. No entanto, assim como qualquer
soluo, ele prov vantagens e desvantagens. Organizando os microservices com a API Gateway
Dentre as vantagens, podemos citar: Depois de conhecermos os conceitos por traz dos microservi-
Implantar a aplicao relativamente simples, uma vez que ces, uma das primeiras perguntas que nos vem cabea : meus
basta fazer o deploy de um nico WAR ou EAR no servidor de clientes ou consumidores (sistemas terceiros) precisam conhecer
aplicao; todos os microservices para se comunicar? Neste caso sim (ou
Simples de monitorar e manter; teramos que desenvolver um conjunto de microservices apenas
Ambiente de desenvolvimento mais simples, onde uma tecno- para possibilitar a comunicao), e isso no bom!
logia core utilizada em todo o projeto. Como exemplo para melhorar o entendimento, vamos utilizar o
caso do ERP citado anteriormente e decompor aquela arquitetura
Dentre as desvantagens, podemos citar: monoltica em servios. Isso nos daria, por exemplo, um servio
Uma mudana feita em uma pequena parte da aplicao exige especfico para o mdulo compras, outro para o financeiro, outro
que todo o sistema seja reconstrudo e implantado; para o contbil e assim por diante.
Escalar a aplicao exige escalar todo o aplicativo, em vez de Uma vez que os microservices estejam prontos para uso, imagine
apenas partes que precisam de maior demanda; que nosso cliente seja uma aplicao web responsvel apenas pela
Alta curva de aprendizado para novos desenvolvedores que camada de apresentao do ERP, e que esta deva se comunicar
entram no time de desenvolvimento, uma vez o desenvolvedor com todos os mdulos (servios). Sendo assim, para evitar que essa
deve entender o contexto de todos os mdulos do projeto; aplicao conhea o endereo de cada um dos servios, devemos
Necessidade de reimplantar tudo para alterar um nico compo- incluir uma camada de abstrao, pois seria muito complexo para
nente. Sendo assim, o risco de falhas aumenta e consequentemente o cliente se encarregar de manter estes endereos atualizados,
um ciclo maior de testes deve ser aplicado. por exemplo.
Para resolver este problema, um padro foi criado: a API
Microservices Gateway. Com o gateway os clientes tero um nico ponto de
Em suma, o estilo arquitetural de microservices consiste no entrada, isto , precisam conhecer apenas um endereo. A partir
desenvolvimento de uma aplicao como um conjunto de peque- disso, a API Gateway se encarrega de encaminhar (rotear) as
nos servios, cada um executando em seu prprio processo. Os requisies para os respectivos servios e devolver a resposta
servios podem ser construdos de forma modular, com base na para o cliente. A Figura 2 apresenta o sistema ERP utilizando a
capacidade de negcio da organizao em questo. nova arquitetura.
Pelo fato dos servios serem construdos de forma independente,
a implantao e a escalabilidade podem ser tratadas de acordo com
a demanda. Essa independncia tambm permite que os servios
sejam escritos em diferentes linguagens de programao e dife-
rentes tecnologias, visando atender a necessidades especficas
da melhor maneira. Outro ponto importante que cada servio
pode ser gerenciado por diferentes times de desenvolvimento,
possibilitando a formao de equipes especializadas.
Para termos uma melhor noo de onde podemos aplicar este
conceito, listamos a seguir algumas vantagens e desvantagens.
Dentre as vantagens, podemos citar:
Fcil entendimento e desenvolvimento do projeto;
Fcil e rpida implantao (build e deploy);
Reduo do tempo de startup, pois os microservices so menores
que aplicaes monolticas em termos de cdigo;
Possibilidade de aplicar a melhor ferramenta para um deter- Figura 2. Exemplo de arquitetura de microservices com a API Gateway
minado trabalho.
Caso de Uso
Dentre as desvantagens, podemos citar: Para aplicar os conceitos que apresentamos at aqui, vamos im-
Dificuldade em implantar e operar sistemas distribudos; plementar um caso de uso utilizando como exemplo uma empresa
Como cada microservice geralmente tem sua prpria base de fictcia de viagens. Esta empresa possui um portal que exibe em
dados, o gerenciamento de transao se torna mais difcil (ml- seu site as viagens e promoes cadastradas pelos parceiros, que
tiplas bases de dados); podem ser, companhias areas ou agncias de viagens.

Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia 15


Arquitetura de Microservices com Spring Boot na prtica

Para entender melhor como o portal da empresa funciona, truiremos uma aplicao (microservice) independente. Na Figura 4
vamos analisar a Figura 3, que ilustra o desenho arquitetural apresentamos a nova arquitetura.
do sistema.

Figura 3. Arquitetura do portal Figura 4. Arquitetura do portal utilizando microservice

Analisando esta imagem, podemos destacar algumas das fun- Com a proposta de uma nova arquitetura definida, vamos colo-
es que o portal possui: car em prtica os conceitos apresentados. Partindo da premissa
Exibir as viagens e promoes para qualquer usurio atravs que nosso portal j existe, o nosso dever ser desenvolver apenas
do site; o servio. Desta forma, tornaremos nosso exemplo mais simples e
Fornecer uma opo administrativa para os clientes parceiros manteremos o foco no objeto de estudo. Por fim, para testar nosso
poderem cadastrar as viagens e suas promoes de destaque; microservice, iremos simular seu acesso pelo portal e por sistemas
Disponibilizar via API (JSON) as viagens em promoo. Essas clientes atravs de um cliente REST.
informaes so obtidas por outros sistemas que consomem a API
do portal e as publicam em seus sites ou aplicativos em forma de Gradle
propaganda. O Gradle uma ferramenta open source de automao de
build que tambm vem sendo muito utilizada para a construo
Repare que o portal responsvel por exibir todo o contedo de projetos. Assim como o Ant e o Maven, fornece mecanismos
de viagens e promoes para seus usurios, disponibilizar uma para facilitar o trabalho de configurao e manuteno do pro-
parte administrativa para clientes/parceiros cadastrarem pacotes jeto, simplificando, por exemplo, as tarefas de gerenciamento de
de viagens, e tambm por expor a API para outros sistemas. dependncias e empacotamento da aplicao. Um dos grandes
diferenciais do Gradle a possibilidade de configurao de forma
Os problemas apresentados declarativa ou programaticamente, atravs da linguagem Groovy
O problema com essa abordagem que para qualquer alterao em vez de XML.
no portal, ou seja, para cada nova verso, seja para corrigir algum
bug ou adicionar alguma funcionalidade, todos os recursos ficaro Instalando o Gradle
indisponveis. A instalao do Gradle bastante simples. Basta fazer o
Outro problema so as frequentes quedas que o portal vem download da distribuio pelo endereo indicado na seo Links,
sofrendo, devido grande quantidade de clientes que consomem a descompactar o pacote no diretrio de sua preferncia e configurar
API. Essas quedas, causadas pelo nmero de requisies, acabam as variveis de ambiente de acordo com o sistema operacional.
indisponibilizando toda a aplicao. Para verificar se a instalao foi concluda com sucesso, execute
o comando gradle -version no terminal. O console deve exibir a
Soluo proposta verso do Gradle, do Groovy e outros detalhes. Se a instalao
Para resolver os problemas listados anteriormente e, principal- e configurao foram realizadas com sucesso, algo semelhante
mente, atender recente demanda de consultas a promoes, Figura 5 deve ser apresentado na sada do console.
o portal ir passar por uma reformulao arquitetural. Vamos
transformar sua arquitetura monoltica em uma arquitetura de Iniciando o desenvolvimento do microservice
microservices com o intuito de ganhar escalabilidade. Para isso, Agora que o Gradle est configurado e pronto para uso, iremos
desacoplaremos a API de promoes de viagens do portal e cons- iniciar a construo do projeto de microservices utilizando alguns

16 Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia


comandos do mesmo. Para isso, crie o diretrio que ir conter projeto Java, como o plugin do Java e algumas dependncias. Para
todos os arquivos do microservice (em nosso exemplo, promocoes) verificar os detalhes dessas configuraes, abra o arquivo build
e depois, atravs do terminal, execute o seguinte comando dentro .gradle em um editor de texto. O contedo deste deve ser seme-
desse diretrio: lhante ao da Listagem 1. Vale ressaltar que os comentrios gerados
automaticamente foram removidos para melhor visualizao.
gradle init --type java-library
Listagem 1. Cdigo do arquivo build.gradle.
Este comando informa ao Gradle para criar um projeto Java
01. apply plugin: java
neste local. Concluda a execuo, a estrutura bsica para iniciar 02.
a implementao do projeto estar pronta (vide Figura 6). 03. repositories {
Note que juntamente com a estrutura de diretrios foi criado 04. jcenter()
05. }
um arquivo chamado build.gradle na raiz do projeto. Este arquivo 06.
responsvel por conter os detalhes de configurao de build 07. dependencies {
do projeto. neste arquivo tambm que devemos incluir plu- 08. compile org.slf4j:slf4j-api:1.7.12
09. testCompile junit:junit:4.12
gins para adicionar funcionalidades ao Gradle, e configurar as 10. }
dependncias.
Com o comando que executamos anteriormente, o Gradle j
se encarregou de incluir algumas configuraes bsicas para o Na linha 1 observamos a declarao do plugin Java. Com esse
plugin o Gradle consegue executar tarefas especficas para proje-
tos que adotam essa linguagem: como executar o mesmo, compilar
o cdigo, gerar artefatos, realizar testes, entre outros.
Em seguida, nas linhas 3 a 5, temos a declarao do repositrio
(JCenter), ou seja, informamos onde o Gradle ir buscar as depen-
dncias declaradas. Logo abaixo, nas linhas 7 a 10 encontramos
as dependncias do projeto. Neste caso, temos a biblioteca de Log
SLF4J e a biblioteca JUnit para testes unitrios.
Repare que as dependncias foram declaradas utilizando as
Figura 5. Testando a instalao/configurao do Gradle
palavras-chave compile e testCompile. Essas declaraes so
disponibilizadas pelo pugin do Java e indicam ao Gradle em que
escopo as dependncias devem ser empregadas, formando um
agrupamento. Ou seja, as dependncias declaradas no escopo
testCompile, por exemplo, so adotadas para compilar o cdigo
de teste do projeto. Outros tipos de agrupamentos que podem ser
utilizados so exibidos na Tabela 1.
Os desenvolvedores acostumados com o Maven podem estranhar
um pouco a forma com que as dependncias so especificadas no
Gradle. O caractere dois pontos (:) utilizado para separar os
atributos grupo, nome e verso da declarao.
A Listagem 2 demonstra como a mesma dependncia (JUnit)
pode ser declarada em ambos os gerenciadores.
Agora que j sabemos o essencial sobre o arquivo build.gradle,
iremos edit-lo e incluir o plugin do Eclipse. Esse plugin ir for-
Figura 6. Estrutura de diretrios do projeto necer ao projeto algumas funcionalidades.

Nome do Agrupamento Contexto


Compile Rene as dependncias necessrias para compilar o cdigo fonte de produo do projeto.
Rene as dependncias necessrias para as classes de produo em tempo de execuo. Por padro, tambm inclui as dependncias de
Runtime
tempo de compilao.
Rene as dependncias necessrias para compilar o cdigo de teste do projeto. Por padro, tambm inclui as classes de produo com-
testCompile
piladas e as dependncias de tempo de compilao.
Rene as dependncias necessrias para executar os testes. Por padro, tambm inclui as dependncias de compilao, tempo de
testRuntime
execuo e teste de compilao.

Tabela 1. Tipos de agrupamentos para as dependncias

Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia 17


Arquitetura de Microservices com Spring Boot na prtica

Listagem 2. Declarao de dependncia com Maven e Gradle. Ao final da execuo o projeto estar pronto para ser importado,
o que pode ser feito acessando o menu File > Import > Existing
//Exemplo utilizando o Maven:
Projects into Workspace.
<dependencies>
<dependency> Uma vez que preparamos a estrutura bsica do projeto, vamos
<groupId>junit</groupId> iniciar as configuraes mais especficas de nossa aplicao, adi-
<artifactId>junit</artifactId>
cionando o suporte ao Spring Boot, framework base para criao
<version>4.12</version>
<scope>compele</scope> do microservice.
</dependency>
</dependencies>
Spring Boot
//Exemplo utilizando o Gradle: Sabemos como complexo e trabalhoso configurar aplicaes
dependencies { nos padres Java EE. Mesmo utilizando o Spring para realizar
compile org.slf4j:slf4j-api:1.7.12
}
a inverso de controle, injeo de dependncias e outras faci-
lidades, ainda preciso realizar o trabalho que muitos desen-
volvedores tentam evitar, a escrita de XML e muitas linhas de
Entre elas, a capacidade de preparar o projeto para ser impor- configuraes.
tado no Eclipse. Pata tal, basta adicionar o seguinte cdigo no Percebendo isso, o Spring iniciou o projeto chamado Spring Boot
arquivo: com o intuito de eliminar a necessidade de XML para configu-
rao, adotando o modelo de conveno sobre configurao (do
apply plugin: eclipse ingls Convention over Configuration CoC). Esse um modelo de
desenvolvimento de software que busca diminuir o nmero de
Feito isso, salve e feche o editor e, no terminal, execute o comando: decises que os desenvolvedores precisam tomar, visando ganhar
simplicidade sem perder flexibilidade.
gradle tasks Seguindo este princpio, basicamente com algumas anotaes
em nosso projeto conseguimos utilizar diversos frameworks de
Deste modo, o Gradle ir acessar o arquivo em questo para mercado sem muito esforo. Essa facilidade alcanada atravs
checar os plugins existentes, e na sequncia ir exibir todas as dos mdulos do Spring Boot. Alguns deles, autoconfigurveis,
tarefas (ou tasks) disponveis para execuo. Observe na listagem so destacados a seguir:
exibida na sada do console que temos algumas tarefas referentes Spring Data JPA;
ao Eclipse, conforme expe a Figura 7. Spring Data MongoDB;
Com os comandos (tasks) para execuo em mos, iremos uti- Spring Web MVC;
lizar o seguinte para que o projeto possa ser importado para o Spring Boot Actuator.
Eclipse:
importante destacar que apesar das configuraes serem rea-
gradle eclipse lizadas de forma automtica, o Spring Boot nos possibilita ter total
controle sobre o projeto. Deste
modo, qualquer conveno pode
ser substituda por uma configu-
rao mais especfica como, por
exemplo, definir a conexo com
a base de dados.
O Spring Boot no gera cdigo
ou realiza edies em arquivos do
projeto para aplicar a conveno.
Em vez disso, quando a aplicao
inicializada, ele injeta dinami-
camente beans e configuraes
no contexto da aplicao. Por
exemplo, se a dependncia do
HSQLDB foi adicionada ao pro-
jeto, e nenhuma especificao de
base de dados foi declarada, ento
um banco de dados em memria
Figura 7. Tarefas disponveis ser configurado.

18 Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia


Configurando o Spring Boot Listagem 4. Declarao de dependncias final do arquivo build.gradle.
Com os conceitos e principais caractersticas do Spring Boot
apresentados, chegou a hora de coloc-lo em prtica e utiliz-lo dependencies {
compile org.slf4j:slf4j-api:1.7.12
na implementao de nosso microservice. Para isso, vamos voltar compile org.springframework.boot:spring-boot-starter-web
ao build.gradle e incluir algumas novas linhas, de acordo com a compile org.springframework.boot:spring-boot-starter-data-jpa
Listagem 3. compile org.hsqldb:hsqldb:2.3.3

testCompile junit:junit:4.12
Listagem 3. Cdigo do arquivo build.gradle. }

01. buildscript {
02. repositories { mavenCentral() }
03. dependencies { Classe de configurao
04. classpath(org.springframework.boot:spring-boot-gradle-plugin: Agora que declaramos todas as dependncias do projeto, ire-
1.2.3.RELEASE)
05. }
mos iniciar a codificao das classes, comeando pela classe de
06. } configurao. Para isso, crie o pacote br.com.javamagazine.pro-
07. mocoes.config e, dentro dele, a classe AppConfig, que ser res-
08. apply plugin: java
09. apply plugin: eclipse ponsvel por conter algumas configuraes bsicas da aplicao
10. apply plugin: spring-boot como, por exemplo, detalhes de conexo com o banco de dados,
11. configuraes especficas de cache, entre outras. Assim, tudo o
12. repositories {
13. jcenter() que geralmente configuramos via XML, faremos via cdigo Java.
14. } Tais ajustes so feitos, basicamente, por meio de anotaes, como
15.
podemos verificar na Listagem 5.
16. dependencies {
17. compile org.slf4j:slf4j-api:1.7.5
18. testCompile junit:junit:4.11
Listagem 5. Cdigo da classe AppConfig.
19. }

01. package br.com.javamagazine.promocoes.config;


Entre as linhas 1 a 6 informamos ao Gradle um repositrio para 02.
03. import org.springframework.boot.SpringApplication;
que ele possa localizar e baixar a dependncia do plugin Spring 04. import org.springframework.boot.autoconfigure.SpringBootApplication;
Boot Gradle. J na linha 10, declaramos o plugin propriamente dito. 05. import org.springframework.boot.orm.jpa.EntityScan;
Essa configurao prov o suporte do Spring Boot ao projeto. 06. import org.springframework.context.annotation.ComponentScan;
Este plugin disponibiliza tarefas para que seja possvel empa- 07. import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
08.
cotar nossa aplicao em JARs ou WARs executveis, e tambm
09. @SpringBootApplication
permite que as verses das dependncias gerenciadas pelo Spring 10. @EntityScan(br.com.javamagazine.promocoes.domain)
Boot sejam omitidas, o que possibilita obter sempre a verso 11. @EnableJpaRepositories(br.com.javamagazine.promocoes.repository)
estvel mais recente. 12. @ComponentScan({ br.com.javamagazine.promocoes.service,
br.com.javamagazine.promocoes.controller })
13. public class AppConfig {
As dependncias do projeto 14.
Para agregar funcionalidades ao microservice como, por exem- 15. public static void main(String[] args) {
plo, acesso base de dados, iremos utilizar alguns recursos. Como 16. SpringApplication.run(AppConfig.class, args);
esperado, estes sero declarados como dependncias do projeto. 17. }
18.
Dito isso, as trs dependncias que iremos utilizar so:
19. }
1. spring-boot-starter-web: essa dependncia prov o bsico
necessrio para iniciarmos um projeto web com Tomcat e Spring
MVC; A anotao @SpringBootApplication, presente na linha 9, rene
2. spring-boot-starter-data-jpa: dependncia que prov suporte as funcionalidades das seguintes anotaes:
Java Persistence API (JPA) e Hibernate; @Configuration: Indica que a classe contm um cdigo com
3. hsqldb: com essa dependncia podemos utilizar uma base definies de beans para o contexto de aplicao;
de dados em memria. O HyperSQL DataBase ou HSQLDB @EnableAutoConfiguration: Informa ao Spring Boot para
um servidor de banco de dados simples escrito em Java. Iremos ativar as configuraes automticas, utilizando como base as
adot-lo pela facilidade de no ser necessrio instalar um banco dependncias declaradas e propriedades de configuraes;
de dados como o MySQL, Oracle, etc. @ComponentScan: Indica ao Spring para buscar por compo-
nentes, configuraes e servios nos diretrios informados no
Dessa forma, a seo de dependncias de nosso build.gradle deve parmetro da anotao. Com isso, o Spring consegue encontrar
ficar semelhante ao cdigo apresentado na Listagem 4. os beans declarados.

Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia 19


Arquitetura de Microservices com Spring Boot na prtica

Nota Listagem 6. Cdigo da entidade Pacote.


O Spring Boot trouxe a anotao @SpringBootApplication como um facilitador ou uma alternativa s
01. package br.com.javamagazine.promocoes.domain;
anotaes @Configuration, @EnableAutoConfiguration e @ComponentScan, que so frequentemente 02.
utilizadas em conjunto. 03. import java.io.Serializable;
04. import java.util.Date;
05.
06. import javax.persistence.Entity;
07. import javax.persistence.GeneratedValue;
Na linha 10 inclumos a anotao @EntityScan e passamos um 08. import javax.persistence.GenerationType;
pacote como parmetro. Essa anotao faz com que o Spring Boot 09. import javax.persistence.Id;
10. import javax.persistence.Table;
escaneie esse pacote em busca de entidades (classes anotadas com 11.
@Entity), e assim, as classes encontradas nesse local passam a ser 12. @Entity
13. public class Pacote implements Serializable {
gerenciadas pelo Spring. 14.
Na sequncia (vide linha 11), temos a anotao @EnableJpaRe- 15. @Id
16. @GeneratedValue(strategy = GenerationType.IDENTITY)
positories. Esta recebe como parmetro o pacote das entidades do 17. private Long codigo;
18. private String origem;
tipo Repository a serem escaneadas. As classes desse tipo so as 19. private String destino;
responsveis por encapsular o mecanismo de persistncia. 20. private String descricao;
21. private Date ida;
Por ltimo, temos a anotao @ComponentScan, que em nosso 22. private Date volta;
caso recebe duas Strings, representando os dois pacotes a serem 23. private Double valor;
24.
escaneados. Note que mencionamos anteriormente que a anotao 25. // mtodos getters e setters omitidos
@SpringBootApplication j inclui as funcionalidades da anotao 26.
27. }
@ComponentScan. Porm, para especificar os pacotes que devem
ser escaneados, devemos fazer uso da mesma.
O projeto Spring Data um framework criado para realizar o
Nota acesso a dados de uma maneira bem simples, mas sem perder a
robustez. Com este framework, conseguimos executar todas as
Normalmente, em aplicaes que utilizam o Spring MVC, anotamos uma classe de configurao com
operaes do CRUD sem que haja a necessidade de implementar-
@EnableWebMvc. Caso isso no seja feito e o projeto faa uso deste framework, o Spring Boot adiciona
mos as operaes. Para tal, basta criar uma interface, para definir
essa anotao automaticamente quando detecta o spring-webmvc no classpath.
nosso repositrio, que estenda a interface CrudRepository.
A interface CrudRepository tem como diferenciais as seguintes
Classe de modelo caractersticas:
Nesta etapa iremos definir a entidade que ir representar um Estender essa interface permite que o Spring encontre os repo-
pacote em nosso sistema. Sendo assim, aps criar o pacote br.com. sitrios e crie os objetos automaticamente;
javamagazine.promocoes.domain, crie uma classe de nome Fornece mtodos que permitem a realizao de algumas opera-
Pacote com o cdigo apresentado na Listagem 6. Essa classe define es comuns, sem a necessidade de declar-los, como: findOne(),
o objeto que ser exibido no portal e disponibilizado via API para findAll(), save() e delete().
outros sistemas plugveis que desejarem divulgar as promoes
do portal de viagens. Alm disso, quando estendemos essa interface, devemos infor-
Por se tratar de uma entidade, observe que temos a anotao mar dois argumentos em sua declarao, sendo:
@Entity declarada sobre a classe (linha 12). Esta informa ao Spring 1. O primeiro, o tipo da entidade que deve ser gerenciada pelo
que objetos desse tipo devem ser tratados como objetos persis- repositrio;
tentes. J nas linhas 15 e 16, temos a declarao das anotaes 2. E o segundo, o tipo do identificador nico da entidade.
@Id e @GeneratedValue para o atributo codigo, definindo assim
o ID da tabela e a forma ou estratgia em que esse ID ser gerado A Listagem 7 apresenta o cdigo de nosso repositrio. Observe
(automaticamente, neste caso). na linha 8 que utilizamos a anotao @Repository para indicar
que este ser um componente da camada de persistncia geren-
O repositrio ciado pelo Spring.
O repositrio tem o papel de encapsular e abstrair a camada de per- J na linha 9 estendemos a interface CrudRepository passando
sistncia. no repositrio que encontramos o cdigo responsvel por a entidade Pacote e o tipo de objeto que representa o identificador
pesquisar, inserir, atualizar e remover registros de nossa aplicao no de nossa classe (neste caso, o tipo Long, do atributo cdigo, que
banco de dados, arquivo, ou outro mecanismo de armazenamento. representa o nosso ID).
Fazendo uso dessa abstrao, o nosso microservice deve permitir
que as operaes de CRUD (Create, Read, Update e Delete) possam O servio
ser realizadas. Para viabilizar esse trabalho, iremos utilizar mais A camada de servio responsvel por conter as regras de
um framework disponibilizado pelo Spring, o Spring Data. negcio da aplicao. Em outras palavras, nessa camada que

20 Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia


implementamos a lgica para que a aplicao execute operaes Listagem 9. Cdigo da classe PacoteServiceimpl.
com base no negcio.
01. package br.com.javamagazine.promocoes.service.impl;
A interface de servio para a entidade Pacote de nosso microser- 02.
vice ser a interface PacoteService, apresentada na Listagem 8. 03. import java.util.Collection;
Como podemos verificar, ela no possui declarao de anotaes 04.
05. import org.springframework.beans.factory.annotation.Autowired;
ou outro detalhe relevante, pois apenas uma interface POJO. 06. import org.springframework.stereotype.Service;
07.
08. import br.com.javamagazine.promocoes.domain.Pacote;
Listagem 7. Cdigo da classe PacoteRepository.
09. import br.com.javamagazine.promocoes.repository.PacoteRepository;
01. package br.com.javamagazine.promocoes.repository; 10. import br.com.javamagazine.promocoes.service.PacoteService;
02. 11.
03. import org.springframework.data.repository.CrudRepository; 12. @Service
04. import org.springframework.stereotype.Repository; 13. public class PacoteServiceImpl implements PacoteService {
05. 14.
06. import br.com.javamagazine.promocoes.domain.Pacote; 15. @Autowired
07. 16. private PacoteRepository repository;
08. @Repository
17.
09. public interface PacoteRepository extends CrudRepository<Pacote, Long> {
10. 18. @Override
11. } 19. public Pacote findByCodigo(Long codigo) {
20. return repository.findOne(codigo);
Listagem 8. Cdigo da interface PacoteService. 21. }
22.
01. package br.com.javamagazine.promocoes.service; 23. @Override
02. 24. public Collection<Pacote> findAll() {
03. import java.util.Collection; 25. return (Collection<Pacote>) repository.findAll();
04. 26. }
05. import br.com.javamagazine.promocoes.domain.Pacote; 27.
06.
28. @Override
07. public interface PacoteService {
08. 29. public Pacote create(Pacote pacote) {
09. Pacote findByCodigo(Long codigo); 30. return repository.save(pacote);
10. 31. }
11. Collection<Pacote> findAll(); 32.
12. 33. @Override
13. Pacote create(Pacote pacote); 34. public Pacote update(Pacote pacote) {
14. 35. return repository.save(pacote);
15. Pacote update(Pacote pacote);
36. }
16.
17. void delete(Pacote pacote); 37.
18. 38. @Override
19. } 39. public void delete(Pacote pacote) {
40. repository.delete(pacote);
41. }
Em seguida, na Listagem 9, apresentamos a classe de servio Pacote- 42.
43. }
ServiceImpl, que implementa a interface criada anteriormente. Alm
disso, essa classe possui a anotao @Service, o que indica ao Spring
que um objeto do tipo PacoteService deve ser criado no contexto da com @RestController (vide linha 16), anotao introduzida na
aplicao. J nas linhas 15 e 16, declaramos o atributo que representa verso 4.0 do Spring, informamos que PacoteController ser um
um objeto do tipo PacoteRepository. Este recebe a anotao @Autowi- controller REST.
re para que o Spring possa realizar a injeo de dependncia, e assim, J a anotao @RequestMapping, declarada na linha 17, prov
teremos um repositrio pronto para ser utilizado. ao Spring informaes de mapeamento dos endpoints para os
Logo aps, temos os mtodos responsveis por filtrar um Pacote mtodos de nossa classe. Ao declarar esta anotao no nvel de
por cdigo, listar todos os pacotes, criar, atualizar e remover um classe passando o valor /api/v1/pacotes para o atributo value, infor-
determinado Pacote. mamos ao Spring MVC que esse ser o prefixo padro utilizado
para compor os endereos do controller. Assim, se tivermos um
O controller REST mtodo contendo essa mesma anotao com o valor /qualquer/coisa,
Agora vamos implementar a API REST de nossa soluo, para a URL completa para acessar esse mtodo via HTTP deve ser /api/
que o microservice possa se comunicar com outras aplicaes. v1/pacotes/qualquer/coisa. Alm disso, essa anotao disponibiliza
Essa implementao ser feita no controller, onde iremos declarar o atributo produces, no qual especificamos o tipo de retorno ou
os endpoints, ou seja, as operaes que nosso servio ir realizar Media Type padro que todos os mtodos devem assumir. Em nos-
a partir do mapeamento de mtodos HTTP e URIs. so caso, declaramos MediaType.APPLICATION_JSON_VALUE,
Para construir nosso controller, crie uma classe chamada constante que representa o texto application/json.
PacoteController no pacote br.com.javamagazine.promocoes Note que tambm utilizamos essa anotao para os mtodos
.controller. Veja o cdigo na Listagem 10. Ao anotar essa classe do controller, como pode ser visto nas linhas 23, 28, 33, 38 e 43.

Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia 21


Arquitetura de Microservices com Spring Boot na prtica

Listagem 10. Cdigo da classe PacoteController.


Mtodo HTTP URL Descrio
POST /api/v1/pacotes Cria um pacote.
01. package br.com.javamagazine.promocoes.controller;
02. Obtm uma lista com todos os pacotes
GET /api/v1/pacotes
03. import java.util.Collection; cadastrados.
04.
Obtm o pacote especfico que possui o ID
05. import org.springframework.beans.factory.annotation.Autowired; GET /api/v1/pacotes/:id
06. import org.springframework.http.MediaType; (cdigo) informado.
07. import org.springframework.web.bind.annotation.PathVariable; Atualiza o pacote especificado de acordo
08. import org.springframework.web.bind.annotation.RequestBody; PUT /api/v1/pacotes/:id
09. import org.springframework.web.bind.annotation.RequestMapping; com o ID (cdigo) informado.
10. import org.springframework.web.bind.annotation.RequestMethod; Remove o pacote especificado de acordo
11. import org.springframework.web.bind.annotation.RestController; DELETE /api/v1/pacotes/:id
com o ID (cdigo) informado.
12.
13. import br.com.javamagazine.promocoes.domain.Pacote; Tabela 2. Operaes suportadas pelo controller
14. import br.com.javamagazine.promocoes.service.PacoteService;
15.
16. @RestController
17. @RequestMapping(value = /api/v1/pacotes,
produces = MediaType.APPLICATION_JSON_VALUE)
18. public class PacoteController {
19.
20. @Autowired
21. private PacoteService service;
22.
23. @RequestMapping(value = /{codigo}, method = RequestMethod.GET)
24. public Pacote get(@PathVariable Long codigo) {
25. return service.findByCodigo(codigo);
26. }
27.
28. @RequestMapping(method = RequestMethod.GET)
Figura 8. Rodando a aplicao
29. public Collection<Pacote> getAll() {
30. return service.findAll();
31. } Ao fazer isso, o console deve apresentar algo semelhante ao
32.
33. @RequestMapping(method = RequestMethod.POST, contedo exibido na Figura 8, onde so listados os passos do
consumes = MediaType.APPLICATION_JSON_VALUE) processo de startup da aplicao.
34. public Pacote create(@RequestBody Pacote pacote) {
35. return service.create(pacote); Para que possamos testar nosso microservice sem a necessi-
36. } dade de utilizar o portal ou um cliente para consumir nossa
37.
38. @RequestMapping(method = RequestMethod.PUT, API, iremos utilizar um plugin do Google Chrome de nome
consumes = MediaType.APPLICATION_JSON_VALUE) Advanced REST Client que permite realizar todas as operaes
39. public Pacote update(@RequestBody Pacote pacote) {
40. return service.update(pacote); necessrias.
41. } Para instalar esse plugin, busque pelo mesmo na pgina do
42.
43. @RequestMapping(method = RequestMethod.DELETE, Chrome Web Store e, em seguida, clique em Usar no Chrome. Como
consumes = MediaType.APPLICATION_JSON_VALUE) podemos verificar na Figura 9, sua interface bastante simples.
44. public void delete(Long codigo) {
45. Pacote pacote = service.findByCodigo(codigo); Outro diferencial que ele fornece algumas opes para facilitar
46. service.delete(pacote); a criao e testes de chamadas HTTP customizadas.
47. }
48. Para isso, na tela do plugin temos o campo URL, onde informa-
49. }
mos o endereo que desejamos acessar, e logo abaixo possvel
definir o mtodo HTTP utilizado para a chamada. Com essas
Nessas declaraes podemos encontrar os atributos method e opes configuradas, basta clicar no boto Send (localizado no
consumes. O atributo method define o mtodo HTTP que dever final do formulrio), para realizar a chamada REST.
ser utilizado. J o atributo consumes define o Media Type adotado Agora que conhecemos o bsico da ferramenta, vamos testar o
para receber as requisies. endpoint de listagem de pacotes fornecido pelo microservice. Para
Desta forma, nosso controller define os endpoints da API tanto, defina no campo URL o endereo http://localhost:8080/api/v1/
conforme detalhado na Tabela 2. Com isso, chegamos ao fim da pacotes/ e selecione o mtodo GET.
implementao do microservice. Agora, precisamos apenas rodar Caso tudo ocorra conforme o esperado, devemos receber o
e testar a aplicao. status 200. No entanto, como no temos nenhuma promoo
na base de dados, nada ser retornado no corpo da resposta do
Testando o microservice cliente REST.
Com o microservice implementado, podemos enfim inicializar
a aplicao. Para isso, atravs do Gradle, via terminal, execute o Populando a base de dados
seguinte comando na raiz do projeto: Para que possamos explorar ao mximo nosso microservice, ire-
mos popular a base de dados da aplicao. Isso pode ser feito com
gradle run a prpria API, com a insero de alguns registros de promoo.

22 Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia


De acordo com o nosso exemplo, esse cadastro ocorre via formu- Nesse momento, o mtodo responsvel por criar uma promoo
lrio no portal e persistido na base de dados do microservice de ser executado e uma resposta contendo o objeto recm-criado
promoes. Para que no precisemos carregar o portal e ensinar ser retornada.
como utiliz-lo, ainda utilizando o plugin, faremos as incluses Agora, repita esse procedimento algumas vezes para cadastrar
executando um POST passando os dados que desejamos incluir. outros pacotes de promoo. Depois, volte a configurar a ferra-
Deste modo, mantenha o endereo http://localhost:8080/api/v1/ menta para listar todos os pacotes e veja a resposta obtida.
pacotes/ no campo URL, selecione o mtodo HTTP POST (note Por fim, com base na listagem exibida na Tabela 2, teste outros
que apesar de utilizar o mesmo endereo, alteramos o mtodo mtodos para obter um pacote, atualizar ou remover determinado
HTTP), inclua manualmente o JSON da Listagem 11 no payload pacote.
da requisio, escolha o valor application/json no combobox Note que em nosso exemplo implementamos apenas operaes
Content-Type localizado abaixo do Payload e, por fim, clique no boto do CRUD para os pacotes de promoo. O comum, no entanto,
Send. Na Figura 10 podemos ver como configurar o plugin para que outras funcionalidades sejam agregadas, como o ranque-
realizar o POST. amento de pacotes por visualizao ou venda, estatsticas, entre
outros, formando assim um microservice mais completo.
O padro arquitetural de microservices vem conquistando adep-
tos nos ltimos meses, e como verificamos, com todo o sentido.
Diante disso, possvel encontrar o tema em destaque em muitos
sites renomados e com entusiasmo em eventos de tecnologia.
Como um reforo para essa afirmao, hoje, grandes empresas
como Netflix, Amazon e eBay j adotam microservices.
No entanto, como demonstrado, existem alguns pontos que
devem ser considerados antes da adoo deste novo modelo de
desenvolvimento, pesando sempre os prs e contras e o contexto
Figura 9. Tela do plugin Advanced REST Client ao qual a soluo proposta ser direcionada.

Autor
Marcos Alexandre Vidolin de Lima
marcosvidolin@gmail.com / @marcosvidolin
Bacharel em Cincia da Computao, possui certificaes em
Java e na plataforma Cloud do Google, entusiasta e amante
de novas tecnologias. Atua profissionalmente como desenvolvedor
Java EE na CI&T. Escreve artigos em revistas especializadas como Java
Magazine e Easy Java Magazine e nas horas vagas mantm seu blog pessoal (www.
marcosvidolin.com).

Links:

Site do projeto Gradle.


https://gradle.org/
Figura 10. Exemplo utilizando o mtodo POST
Endereo para download do Gradle.
http://gradle.org/gradle-download/
Listagem 11. Payload (JSON) da requisio.
Documentao oficial do Spring Boot.
{ http://docs.spring.io/spring-boot/docs/current/reference/html/
origem: Campinas / SP,
destino: Cancn, MEX, Artigo de Martin Fowler sobre Microservices.
descricao: Areo, Hospedagem e Caf da manh,
http://martinfowler.com/articles/microservices.html
ida: 2015-09-07,
volta: 2015-09-11,
Plugin Advanced REST Client do Google Chrome.
valor: 1500.00
} https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfg-
cellkdfbfbjeloo

Cdigo do Artigo.
https://github.com/marcosvidolin/jm-ArquiteturaDeMicroservicesComSpringBoot

Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia 23


Hibernate Validator: como validar objetos e ter mais controle sobre os dados

Hibernate Validator: como


validar objetos e ter mais
controle sobre os dados
Aprenda neste artigo como melhorar a qualidade
dos dados que sua aplicao necessita para um
correto funcionamento

A Fique por dentro


validao de dados uma tarefa bastante
comum em sistemas onde a entrada de dados
feita principalmente pelo usurio. Em qual- Este artigo til por apresentar como expressar e validar regras
quer aplicao, receber dados sempre foi um grande existentes no domnio de negcio de uma aplicao. Para isso,
problema, pois no h como prever todas as maneiras aprenderemos de forma bsica e simples os principais conceitos
que o usurio utilizar para informar seus dados. Por relativos ao Hibernate Validator, fazendo uma anlise geral sobre seu
exemplo, caso o campo que receber uma data no funcionamento, como configurar um ambiente de desenvolvimento
especifique o formato esperado pela aplicao, no h com Maven, Eclipse, MySQL e Tomcat para uso desta tecnologia e,
como garantir que o usurio entrar com o dado no em seguida, como desenvolver uma aplicao com JSF e o padro
formato desejado, o que acaba se tornando um desafio arquitetural MVC que faz uso de seus recursos.
aos programadores.
Diante disso, necessrio realizar o tratamento
adequado de todas as informaes que so enviadas Considerando que as polticas de validao no estruturadas
para evitar que problemas inesperados venham a e no controladas vo levar ao aumento dos custos de suporte
ocorrer durante o processamento, como excees que e manuteno, uma estratgia de validao consolidada pode
interrompero a execuo do sistema, problemas de minimizar significativamente o efeito cascata de mudanas para
integridade ou corrupo dos dados e tambm questes sua base de cdigo. Alm disso, a camada de validao tambm
relacionadas falha de segurana. passa a ser uma ferramenta muito til durante o processo de de-
Cada informao passada para a aplicao possui um purao, ajudando a localizar defeitos que comprometem o bom
propsito. Assim, natural que algumas regras sejam funcionamento da aplicao.
introduzidas com o intuito de controlar a interao Engajado nesta causa, o Hibernate Validator um projeto open
entre o usurio e o sistema, garantindo deste modo a source conduzido pela empresa Red Hat que permite a validao
correta execuo das regras de negcio. E com o intuito dos dados, presentes nas classes que modelam o domnio da apli-
de garantir o cumprimento dessas regras que o conceito cao, em qualquer arquitetura (Web, Desktop, etc.) e em tempo de
de validao foi implementado. Validar determinar execuo. A motivao para a utilizao dessa biblioteca poder
se os dados capturados pelo sistema seguem as regras validar os dados diretamente no domnio da aplicao, em vez
lgicas definidas para manter a sua consistncia. de realizar esse processo por camadas. Dessa forma, possvel
Neste contexto, conseguir consolidar e implementar validar campos numricos, definir se datas informadas sero
a validao usando uma soluo de qualidade como o obrigatoriamente maiores ou menores que a data atual, verificar
Hibernate Validator pode melhorar significativamente se o campo pode ser vazio ou no diretamente nas classes de
a confiabilidade do software, especialmente ao longo domnio de maneira centralizada e flexvel, mantendo o cdigo
do tempo, e torn-lo mais amigvel ao usurio. claro e enxuto.

24 Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia


A partir disso, ao longo desse artigo
abordaremos os principais conceitos e
caractersticas do Hibernate Validator, e
veremos como desenvolver um sistema de
cadastro de projetos considerando como
um dos seus principais requisitos no
funcionais a confiabilidade do sistema.
Para tanto, sero empregados, alm do
Validator, a linguagem de programao
Java, o ambiente de desenvolvimento
Eclipse integrado ao Maven, o sistema de
gerenciamento de banco de dados MySQL, Figura 1. Validao realizada em vrias camadas. Fonte: Hibernate Validator Reference Guide
o framework JSF e o container web Tomcat.
Ademais, o Hibernate ser usado como
soluo integrante da camada de persis-
tncia, viabilizando a interface entre a
aplicao e o MySQL.

Hibernate Validator
O Hibernate um framework de mape-
amento objeto relacional muito popular
entre os desenvolvedores Java. Distri-
budo sob a licena LGPL, foi criado por
Gavin King em 2001, sendo atualmente
o framework de persistncia de dados
mais utilizado. Segundo a documentao
oficial: o Hibernate pretende retirar do
desenvolvedor cerca de 95% das tarefas
Figura 2. Validao centralizada no modelo de domnio. Fonte: Hibernate Validator Reference Guide
mais comuns de persistncia de dados.
Sua principal caracterstica a transfor-
mao de classes Java em representaes Uso de injeo de dependncias e inte- esse que mais simples do que quando
de tabelas da base de dados (e dos tipos de grao com CDI; feito por camada. Na validao por cama-
dados Java para os da SQL). O Hibernate Validao de parmetros e retornos de da, necessrio verificar o mesmo dado
gera os comandos SQL e libera o desenvol- mtodos; diversas vezes (nas camadas de apresen-
vedor do trabalho manual de transforma- Uso de grupos de converso; tao, negcio, persistncia, etc.), a fim
o, mantendo o programa portvel para Suporte concatenao de mensagens de de garantir a consistncia da informao,
quaisquer bancos de dados SQL. violao atravs deexpression language; conforme mostra a Figura 1. Ao validar os
O Hibernate Validator, por sua vez, a Integrao com outras especificaes, dados diretamente nas classes de domnio,
implementao de referncia da JSR 303 como JAX-RS. o processo todo fica centralizado, uma vez
Bean Validation API. Disponibilizada em que os objetos destas classes normalmente
dezembro de 2009, a partir da especifica- Antes do surgimento dessa API, cada trafegam entre as camadas da aplicao.
o do Java EE 6, na qual foi introduzida framework implementava um mecanismo O Hibernate Validator, como principal
a especificao Bean Validation 1.0, o proprietrio para validar as informaes, implementao da Bean Validation API,
objetivo principal dessa API permitir o que criava problemas de incompatibili- segue a premissa estabelecida pelo DRY
a validao dos dados de forma fcil e dade e dificultava a integrao com outros (Dont Repeat Yourself), que especifica uma
rpida, atravs do uso de anotaes e, de frameworks. forma de adicionar regras e respectivas
forma alternativa, utilizando arquivos Com o surgimento dessa especificao, verificaes para validao automtica dos
XML na configurao. possibilitou-se uma API padro para dados, de maneira que estas validaes
Com o lanamento mais recente da pla- validao que flexvel o suficiente para sejam implementadas uma e somente uma
taforma Java EE, agora na verso 7, a JSR ser utilizada pelos mais diversos tipos de vez em toda a aplicao e gerenciadas de
349 foi divulgada, introduzindo a verso frameworks. Alm disso, a Bean Validation maneira centralizada, eliminando a dupli-
1.1 da API de validao e trazendo novi- API viabiliza a validao de dados nas cao entre as diversas camadas. A Figura 2
dades como: classes do domnio da aplicao, processo mostra esta configurao, em que todas as

Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia 25


Hibernate Validator: como validar objetos e ter mais controle sobre os dados

camadas podem invocar a verificao concentrada em um nico @Valid: Opo utilizada para validar atributos que referenciam
lugar. Com isso, evita-se a reescrita de cdigo, uma vez que o outras classes, impondo uma validao recursiva aos objetos
mesmo no mais inserido em diferentes partes da aplicao, associados.
e facilita-se a manuteno, proporcionando, simultaneamente,
economia no tempo de desenvolvimento. Cada annotation associada a uma implementao de validao,
As validaes do framework so definidas atravs de restries que verifica se a instncia da entidade obedece regra relacionada.
realizadas diretamente nos Java Beans, especificados no modelo O Hibernate faz isto automaticamente antes que uma insero ou
de domnio. Essas restries so utilizadas para definir regras a atualizao seja realizada no banco de dados, mas o desenvolve-
respeito dos dados que podem ser atribudos a um objeto. Assim, dor tambm pode chamar a validao a qualquer momento em
quando um processo de validao de dados executado, feita sua aplicao.
uma verificao para checar se os mesmos esto de acordo com
as regras estabelecidas. Nota
As restries so demarcadas atravs de Java annotations, sendo
Todos os elementos do Hibernate Validator (classes, interfaces, annotations, etc.) pertencem
possvel adicion-las tanto nas propriedades do bean quanto nas
ao pacote javax.validation. Portanto, sempre que algum elemento da API for referenciado, ser
chamadas de mtodos, garantindo que os retornos dos mtodos
necessrio realizar o import desse pacote ou mesmo de seus subpacotes.
ou os valores dos parmetros sejam validados. Outra maneira de
adicionar regras diretamente na classe. Neste caso, no apenas
uma propriedade submetida validao, mas todo o objeto. Configurao do exemplo
Restries no nvel de classe so teis caso a validao dependa Vamos partir para a parte prtica e desenvolver uma aplicao
de uma correlao entre vrias propriedades de um objeto. Por que possibilite ao leitor visualizar como o framework funciona e
exemplo, uma classe Carro que tenha dois atributos (quanti- sua utilidade.
dadeDeAssentos e passageiros). Deve ser assegurado que a No entanto, antes de comear a codificar, importante instalar
lista de passageiros no tenha mais entradas do que os assentos os softwares que nos auxiliaro nesse trabalho e tambm preparar
disponveis. Dessa forma, o validador da restrio tem acesso ao o ambiente de desenvolvimento para uso do Validator.
objeto Carro, possibilitando comparar o nmero de assentos com
o nmero de passageiros. Preparando o ambiente de desenvolvimento
O Hibernate Validator oferece vrias validaes, mas no limita o Como IDE(Ambiente de Desenvolvimento Integrado), optamos
desenvolvedor a elas, ou seja, tambm possibilita a criao de novas pelo Eclipse, por se tratar de uma soluo extremamente podero-
regras, uma vez que nem sempre esses validadores sero suficien- sa e flexvel, assim como por ser uma das mais utilizadas pelos
tes. Por exemplo, a biblioteca dispe de anotaes que verificam a desenvolvedores.
numerao de cartes de crdito, e-mail, URL e, at mesmo, CNPJ, O processo de instalao do Eclipse bastante simples, sendo
CPF e Ttulo Eleitoral, mas tambm podem ser criadas novas va- necessrio apenas ter um JDK instalado no sistema. Na seo
lidaes como, por exemplo, para certificar se o valor inserido em Links est disponvel o endereo para download do JDK e
um campo um valor vlido para a placa de um carro. da IDE, cuja verso adotada no exemplo foi o Eclipse Luna
As restries padro so: SR2 (4.4.2).
@NotNull: Verifica se um dado no nulo; Concludo o download, descompacte-o no seu sistema de arqui-
@Null: Verifica se um dado nulo; vos, em um local de sua preferncia. Neste artigo optamos pela
@AssertFalse e @AssertTrue: Checa se o dado verdadeiro pasta C:\Eclipse_Luna. Em seguida, preciso apenas executar o
ou falso. Estas validaes podem ser aplicadas ao tipo primitivo arquivo eclipse.exe.
boolean ou classe Boolean;
@Min e @Max: Validam o valor mnimo ou o valor mximo Integrando o Maven ao Eclipse
para os tipos BigDecimal, BigInteger, String, byte, short e suas O Maven uma das ferramentas mais conhecidas e utilizadas
classes wrappers correspondentes; por profissionais que adotam o Java em seus projetos. Com o
@Size: Valida se o tamanho do dado est entre os valores espe- objetivo de simplificar o gerenciamento de dependncias e o
cificados nos atributos min e max. Aplica-se a Strings, Collections ciclo de vida do desenvolvimento (compilao, testes unitrios,
e Arrays; empacotamento e distribuio), esta soluo da Apache garante
@Pattern: Valida o dado de acordo com uma expresso regular as seguintes metas:
especificada pelo atributo regexp da anotao. Funciona somente Prover um padro para o desenvolvimento de aplicaes;
para dados do tipo String; Fornecer mecanismos para uma clara definio da estrutura
@Past: Checa se o valor do campo ou propriedade deve ser uma do projeto;
data passada em relao atual; Controlar verso e artefatos;
@Future: Verifica se o valor do campo ou propriedade deve ser Viabilizar/facilitar o compartilhamento de bibliotecas entre
uma data futura em relao atual; projetos.

26 Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia


Como maior atrativo, a principal facilidade viabilizada pelo
Maven o gerenciamento de dependncias e este ser o nosso
motivador para empreg-lo em parceria com o Eclipse.
O endereo para download desta soluo encontra-se na seo
Links. Ao acess-lo, opte pela verso 3.3.1. Para a instalao, crie
uma pasta no sistema de arquivos (C:\Maven) e copie o arquivo
baixado para dentro dela, descompactando-o em seguida.
Com o objetivo de integrar o Maven ao Eclipse, recomenda-se
instalar o plugin M2E. No entanto, como a verso da IDE que es-
tamos utilizando j vem com esse plugin e uma instalao interna
do Maven, no precisaremos adicionar o M2E.
Para conhecer a verso do Maven que est configurada, com
o Eclipse aberto, acesse o menuWindow > Preferencese escolha
a opoMaven > Installations, como sugere a Figura 3. Ao fazer
isso voc poder notar a presena da verso embarcada. Apesar
disso, vamos optar pela verso do Maven que baixamos anterior-
mente, por ser mais recente.
Figura 4. Adicionando o Tomcat ao Eclipse

O sistema gerenciador de banco de dados


O sistema gerenciador de banco de dados que utilizaremos para
viabilizar a persistncia em nosso exemplo ser o MySQL (veja o
endereo na seo Links). Ao se deparar com as diferentes verses,
opte pela adotada neste material, a Community Server 5.6.22.
Aps baixar o respectivo arquivo, execute os seguintes passos
para instalao:
1. Inicie o instalador e aguarde enquanto o sistema operacional
o configura;
2. Na tela seguinte, sero exibidos os termos do contrato de licena
do produto. Aceite os termos e clique em Next;
3. Chegou o momento de especificar o tipo de instalao e depois
clicar em Next. A escolha vai depender de cada profissional e para
que ele vai usar o MySQL. Aqui, optamos pela opo Custom;
4. No prximo passo o usurio deve escolher os produtos que
deseja instalar. Escolha o MySQL Server 5.6.22 e clique em Next.
Feito isso, sero exibidos os produtos selecionados na etapa an-
terior. Clique ento em Execute para continuar;
5. No final do processo de instalao, a coluna Status passar a
exibir a informao Complete. Assim, pressione Next mais duas
Figura 3. Instalao padro do Maven no Eclipse vezes;
6. Agora o usurio deve escolher o tipo de configurao. Para os
Deste modo, para adicionar o Maven ao Eclipse, ainda na Figura 3, nossos objetivos, apenas mantenha os valores padro e clique
clique emAdd e selecione a pasta C:\Maven\apache-maven. Feito isso, em Next;
automaticamente o arquivo de configurao do Maven localizado e 7. Na prxima tela, informe a senha do administrador e continue
a verso desejada adicionada IDE. Para concluir, clique em Ok. (Next);
8. Chega o momento de configurar o MySQL como um servio
Adicionando o Tomcat ao Eclipse do Windows. Para tanto, apenas mantenha os valores default e
Para adicionarmos o Tomcat ao Eclipse, necessrio acessar a aba clique em Next;
Servers, clicar em Add Server e selecionar o caminho da instalao 9. A janela apresentada mostra todas as configuraes que sero
deste servidor web, como mostra a Figura 4. Alm do caminho aplicadas. Confirme as escolhas feitas previamente, clique em
de instalao do Tomcat, necessrio informar o diretrio de Execute e, na tela seguinte, em Next;
instalao do Java. O Tomcat 8.0 exige que a verso utilizada do 10. Por fim, uma janela confirma a configurao do MySQL. Ento,
Java seja igual ou superior a 7. pela ltima vez, clique em Next, e logo depois, em Finish.

Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia 27


Hibernate Validator: como validar objetos e ter mais controle sobre os dados

Desenvolvendo o cadastro de projetos Criando o projeto Maven no Eclipse


Agora que temos o banco de dados instalado, assim como o Com todos os recursos instalados, vamos partir para a elabo-
Eclipse e o Maven integrados e o Tomcat incorporado ao Eclipse, rao do projeto web criando um novo com o auxlio do Maven,
vamos partir para a construo de uma soluo web lanando mo no Eclipse. Como utilizaremos anotaes JPA, importante que
do JSF 2.2 e do container Tomcat 8.0. O objetivo desta aplicao o projeto adote o Java 1.5+.
ser gerenciar o cadastro de projetos de uma corporao. Dito isso, com o Eclipse aberto, clique em New > Other. Na tela
O sistema conter, para o fcil entendimento desse estudo de que surgir, selecione Maven > Maven Project, marque a opoCreate
caso, apenas uma entidade, de nome Projeto, e a partir dela sero a simple project (skip archetype selection)e pressioneNext.
construdas as principais operaes necessrias para se ter um Na prxima tela, devemos identificar o projeto, o que feito ao
cadastro: salvar, atualizar, listar e excluir. especificar estas opes e clicar em Finish:
Alm disso, cada projeto conter as seguintes propriedades: cdi- Group ID:br.com.devmedia;
go, nome, nome do responsvel pelo projeto, CPF do responsvel, Artifact ID:hibernate-validator;
e-mail, data de incio, data de fim e descrio. A Figura 5 mostra Packaging: war;
a representao grfica da tabela. Version: 0.0.1-SNAPSHOT.

Criando o banco de dados Para completar a configurao inicial do projeto, vamos deter-
Com o MySQL instalado, crie o banco projetobd executando o minar alguns parmetros adicionais para que a aplicao seja
script SQL indicado na Listagem 1. Neste comando, as duas pri- executada conforme desejamos. Assim, clique com o boto direito
meiras linhas especificam a gerao do banco de dados e como na raiz do projeto e depois na opoProperties.
entrar em seu contexto. A tabela e seus respectivos atributos so Na nova tela, selecione a opo Project Facets. A partir disso,
especificados na sequncia do cdigo. vamos ajustar as configuraes relacionadas s verses do Java,
JSF e do mdulo web. Portanto, selecione a verso 3.1 paraDynamic
Web Module; na opoJava, escolha a verso 1.8; e para o JavaServer
Faces opte pela verso 2.2.
Apesar desses ajustes, observe que a estrutura do projeto ainda
no est definida com as configuraes de um projeto Maven.
Para isso, necessrio atualiz-lo. Portanto, clique com o boto
direito sobre o projeto e acesse o menuMaven > Update Project.
Na tela que aparecer, selecione a opo hibernate-validator, que
acabamos de criar, e clique emOkpara atualiz-lo de acordo com
as definies do Maven. Assim, o projeto passar a ter a estrutura
apresentada na Figura 6.

Figura 5. Representao grfica da tabela projeto

Listagem 1. Script para criao do banco de dados.

01. CREATE database projetobd;


02. USE empresabd;
03.
04. CREATE TABLE IF NOT EXISTS projeto (
05. codigo INT NOT NULL,
06. nome VARCHAR(45) NOT NULL, Figura 6. Viso Package Explorer da estrutura de diretrios do projeto
07. responsavel VARCHAR(45) NOT NULL,
08. email VARCHAR(45),
09. cpf VARCHAR(14) NOT NULL, Adicionando as dependncias
10. data_inicio DATE, Aps criar o projeto devemos inserir as dependncias, isto , as
11. data_fim DATE, bibliotecas que sero utilizadas pela aplicao. Para isso, devemos
12. descricao VARCHAR(20),
fazer ajustes que refletiro no contedo do arquivo pom.xml, que
13. PRIMARY KEY (codigo))
14. ENGINE = InnoDB;
o principal arquivo do Maven e que contm todas as configuraes
relacionadas ao projeto.

28 Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia


Para inserir as dependncias, clique com o boto direito sobre o
POM e acesse Maven > Add Dependency. Na nova janela, informe
o nome das bibliotecas que deseja utilizar (Hibernate Core, Hi-
bernate Validator, JSF e o driver do MySQL), como exemplificado
na Figura 7, e clique em Ok.
Concluda essa etapa, o pom.xml ter o contedo mostrado na
Listagem 2.
Selecionadas as dependncias, aps clicar com o boto direito do
mouse sobre o projeto, acesse Maven > Update Project e automatica-
mente as bibliotecas sero incorporadas ao classpath do projeto.

Criando o modelo e inserindo as anotaes de validao


Nosso prximo passo criar e mapear a entidade projeto, assim
como definir as restries que desejamos. Deste modo, crie a classe
Projeto, classe de negcios que ser mapeada pelo Hibernate como
uma tabela no banco de dados. Ademais, como ser possvel notar
em seu cdigo, Projeto um tipo de classe simples, definida como
um POJO, que contm todos os atributos encapsulados atravs de
mtodos de acesso e disponibiliza o construtor padro.
Antes de implementar essa classe, no entanto, crie o pacote
br.com.jm.projeto.model. Para isso, com o boto direito do mouse
sobre o projeto hibernate-validator, acesse New > Package e informe
seu nome. Em seguida, novamente com o boto direito do mouse,
acesse New > Class. Na tela que surgir, informe Projeto no campo
nome. A Listagem 3 mostra o cdigo dessa classe. Figura 7. Adicionando dependncias no arquivo pom.xml

Listagem 2. Configurao do arquivo pom.xml.

01. <project xmlns=http://maven.apache.org/POM/4.0.0 32. <dependency>


02. xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance 33. <groupId>com.sun.faces</groupId>
03. xsi:schemaLocation=http://maven.apache.org/POM/4.0.0 34. <artifactId>jsf-impl</artifactId>
04. http://maven.apache.org/xsd/maven-4.0.0.xsd> 35. <version>2.2.9</version>
05. <modelVersion>4.0.0</modelVersion> 36. </dependency>
06. <groupId>br.com.devmedia</groupId> 37. <dependency>
07. <artifactId>hibernate-validator</artifactId> 38. <groupId>mysql</groupId>
08. <version>0.0.1-SNAPSHOT</version> 39. <artifactId>mysql-connector-java</artifactId>
09. <packaging>war</packaging> 40. <version>5.1.34</version>
10. <dependencies> 41. </dependency>
11. <dependency> 42. <dependency>
12. <groupId>javax</groupId> 43. <groupId>org.hibernate</groupId>
13. <artifactId>javaee-api</artifactId> 44. <artifactId>hibernate-validator</artifactId>
14. <version>7.0</version> 45. <version>5.1.3.Final</version>
15. </dependency> 46. </dependency>
16. <dependency> 47. </dependencies>
17. <groupId>javax.servlet</groupId> 48. <build>
18. <artifactId>javax.servlet-api</artifactId> 49. <plugins>
19. <version>3.1.0</version> 50. <plugin>
20. <scope>provided</scope> 51. <groupId>org.apache.maven.plugins</groupId>
21. </dependency> 52. <artifactId>maven-compiler-plugin</artifactId>
22. <dependency> 53. <version>3.1</version>
23. <groupId>org.hibernate</groupId> 54. <configuration>
24. <artifactId>hibernate-core</artifactId> 55. <source>1.8</source>
25. <version>4.3.10.Final</version> 56. <target>1.8</target>
26. </dependency> 57. </configuration>
27. <dependency> 58. </plugin>
28. <groupId>com.sun.faces</groupId> 59. </plugins>
29. <artifactId>jsf-api</artifactId> 60. </build>
30. <version>2.2.4</version> 61. </project>
31. </dependency>

Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia 29


Hibernate Validator: como validar objetos e ter mais controle sobre os dados

Listagem 3. Cdigo da classe Projeto.

01. package br.com.jm.projeto.model; 33. private String descricao;


02. 34.
03. //imports omitidos 35. @Pattern(regexp = ([^.@]+)(\\.[^.@]+)*@([^.@]+\\.)+([^.@]+),
04. message = Email invlido)
05. @Entity 36. @Column
06. @Table 37. private String email;
07. public class Projeto implements Serializable { 38.
08. 39. @Future(message=A data deve ser maior do que a atual.
09. private static final long serialVersionUID = 1L; Voc digitou: + ${validatedValue})
10. 40. @Temporal(TemporalType.DATE)
11. public Projeto() {} 41. @Column
12. 42. private Date dataInicio;
13. @Id 43.
14. @Column 44. @Temporal(TemporalType.DATE)
15. @GeneratedValue(strategy = GenerationType.AUTO) 45. @Column
16. private int codigo; 46. private Date dataFim;
17. 47.
18. @NotEmpty (message=Informe o nome do Projeto) 48. @Future(message=A data deve ser maior do que a atual.
19. @Column Voc digitou: + ${validatedValue})
20. private String nome; 49. public Date getDataFim() {
21. 50. return dataFim;
22. @NotEmpty (message=Informe o nome do Responsvel pelo Projeto) 51. }
23. @Column 52.
24. private String responsavel; 53. public void setDataFim(Date dataFim) {
25. 54. this.dataFim = dataFim;
26. @CPF(message=CPF invlido ) 55. }
27. @NotEmpty(message=Informe o nmero do CPF) 56.
28. @Column 57. public boolean isFimdeSemana(@NotEmpty(message =
29. private String cpf; Data de trmino nao pode ser nulo)Date dataTermino) {
30. 58. return true;
31. @Size(max = 10, message=Descrio deve ter no mximo {max} 59. }
caracteres. Voc digitou: + ${validatedValue}) 60. //gets e sets omitidos
32. @Column 61. }

O leitor mais atento identificar em Projeto anotaes referentes que o atributo message, que personaliza a mensagem de erro a ser
ao Hibernate e ao Hibernate Validator. Logo no incio, na linha 5, exibida, possui a expresso max entre chaves. Este um recurso da
declaramos @Entity. Esta anotao sinaliza que haver uma tabela especificao que permite inserir na mensagem de erro os valores
relacionada a essa classe no banco de dados e que os objetos desta dos prprios atributos das anotaes. Alm disso, concatenamos a
classe sero persistidos. J as anotaes @Column e @Table so mensagem de erro com a varivel validateValue, recuperada via
usadas para indicar que os campos representam colunas e tabelas, Expression Language, para exibir o valor digitado pelo usurio. A
respectivamente, no banco de dados. concatenao com EL um novo recurso implementado na verso
A anotao @Id (linha 13), por sua vez, informa qual atributo 1.1 de Bean Validation;
ser mapeado como chave primria da tabela. Na linha 15 veri- Linha 35: A anotao @Pattern utilizada quando se deseja
ficamos tambm a anotao @GeneratedValue, que geralmente checar um campo a partir de uma expresso regular. Nesse caso
acompanha @Id e que serve para indicar que o valor do atributo foi criada uma expresso regular para verificar se a informao
que define a chave primria deve ser criado pelo banco ao per- repassada corresponde a um e-mail vlido. Alm da expresso
sistir o registro. E a anotao @Temporal(TemporalType.DATE), regular, outra forma de verificar se o endereo de e-mail infor-
presente nas linhas 40 e 44, especifica que os campos dataInicio e mado valido atravs da anotao @Email;
dataFim iro trabalhar com valores no formato de uma data. Linhas 39 e 48: A anotao @Future verifica se a data informada
As demais anotaes so referentes ao processo de validao e posterior data atual.
sero explicadas a seguir:
Linhas 18, 22 e 27: A anotao @NotEmpty direcionada para Vale ressaltar que a validao tambm pode ser realizada em
atributos do String, Collection, Map ou Array e verifica se qual- mtodos de acesso. A linha 48 ilustra essa situao, onde a vali-
quer um desses no nulo e nem vazio; dao feita diretamente no mtodo getDataFim().
Linha 26: A anotao @Cpf, inserida na verso 5.0.0 Alpha1 do Outro recurso disponvel a validao de parmetros passados
Hibernate Validator, verifica se o valor informado corresponde a para os mtodos. Para demostrar esse recurso, implementamos
um CPF vlido, de acordo com as regras nacionais; o mtodo de negcio isFimdeSeamana() na classe Projeto para
Linha 31: A anotao @Size validar a String para verificar se verificar se a data cadastrada como trmino do projeto refere-se a
seu tamanho tem no mximo 10 caracteres. Observe neste caso um dia de final de semana. Na assinatura desse mtodo, observe

30 Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia


que antes do parmetro dataTermino, colocamos uma validao tag <f: validateBean>. Esta tem como objetivo integrar o Bean
especificando que o valor no pode ser vazio e uma mensagem Validation ao JSF. Assim, sinalizamos que todos os campos que
de erro. estiverem dentro dela sero checados. Outra tag importante a
<h:messages>, vista na linha 5, que responsvel por mostrar na
Criando o Controller da aplicao tela os possveis erros que ocorrero na validao.
A camada de controle do JSF composta pelos Managed Beans, Para concluir a implementao da view, vamos criar a pgina
elementos responsveis por controlar o fluxo de processamento que ser exibida caso a operao de persistncia seja realizada
e estabelecer a ligao entre nosso modelo e a camada de viso. com sucesso, ou seja, o preenchimento do formulrio no viole as
Sabendo disso, para criar o nosso bean gerenciado, clique com o restries aplicadas classe Projeto. O cdigo da pgina sucesso
boto direito do mouse sobre o projeto, selecione New > Class e .xhtml pode ser visto na Listagem 6.
nomeie a classe como ProjetoBean. O seu cdigo apresentado
na Listagem 4, e como verificado, deve ficar no pacote br.com Listagem 5. Formulrio de entrada de dados.
.jm.projeto.managedbean.
01. <h:body>
02. <h2>Preencha o formulrio abaixo</h2>
Listagem 4. Cdigo da classe ProjetoBean.
03. <f:view>
04. <h:form id=frmProjeto method=post>
01. package br.com.jm.projeto.managedbean;
02. 05. <h:messages style=color:red;margin:8px; />
03. //imports omitidos 06. <h:panelGrid columns=2 style=horizontal-align:center>
04. 07. <f:validateBean>
05. @ManagedBean 08. <h:outputText value=Nome do Projeto: />
06. @RequestScoped 09. <h:inputText value=#{projetoBean.projeto.nome} />
07. public class ProjetoBean implements Serializable{ 10. <h:outputText value=Responsvel: />
08. 11. <h:inputText value=#{projetoBean.projeto.responsavel} />
09. private static final long serialVersionUID = 1L; 12. <h:outputText value=CPF do Responsvel: />
10. private Projeto projeto = new Projeto(); 13. <h:inputText value=#{projetoBean.projeto.cpf } />
11. 14. <h:outputText value=Email do Responsvel: />
12. public String salvar(){ 15. <h:inputText value=#{projetoBean.projeto.email} />
13. ProjetoDao dao = new ProjetoDaoImp(); 16. <h:outputText value=Data de Inicio do Projeto: />
14. dao.save(projeto); 17. <h:inputText value=#{projetoBean.projeto.dataInicio}>
15. FacesContext.getCurrentInstance().addMessage( 18. <f:convertDateTime pattern=dd/MM/yyyy type=date />
16. null,
19. </h:inputText>
17. new FacesMessage(FacesMessage.SEVERITY_INFO,
20. <h:outputText value=Data de Trmino do Projeto: />
18. Manuteno de projeto: ,
21. <h:inputText value=#{projetoBean.projeto.dataFim}>
19. projeto incluido com sucesso!));
22. <f:convertDateTime pattern=dd/MM/yyyy type=date />
20. return sucesso;
21. } 23. </h:inputText>
22. //mtodos get e set omitidos 24. <h:outputText value=Descrio: />
23. } 25. <h:inputTextarea value=#{projetoBean.projeto.descricao} />
26. </f:validateBean>
27. </h:panelGrid>
Na linha 6, com a anotao @RequestScoped, definimos que esse 28. <h:commandButton action=#{projetoBean.salvar} value=Enviar />
29. <input type=reset value=Limpar />
Managed Bean ter escopo de requisio. Na linha 12, declaramos 30. </h:form>
uma varivel de instncia do tipo Projeto e na linha 14 implemen-
tamos o mtodo salvar(), que realiza a validao do objeto Projeto Listagem 6. Cdigo da pgina sucesso.xhtml.

e direciona o fluxo da aplicao para alguma pgina neste caso, 01. <h:body>
a pgina sucesso.xhtml, que criaremos em breve. 02. <f:view>
03. Cadastro realizado com sucesso
04. </f:view>
Criando a camada View da aplicao 05. </h:body>
O prximo passo ser criar a pgina web por onde sero espe-
cificadas as informaes do projeto. Essa pgina se comunica
diretamente com os mtodos e atributos da classe ProjetoBean. Configurando o Hibernate e a aplicao
Portanto, clique com o boto direito do mouse sobre o projeto, Nesse momento vamos voltar nossa ateno configurao do
selecione New > HTML File, nomeie o arquivo como project_form Hibernate, onde devemos informar os detalhes para acesso ao
.xhtml e clique em Next. Na lista que aparece, escolha o tipo banco de dados, assim como realizar o mapeamento da nossa
detemplateHTML (xhtml 1.0 strict) e clique emFinish. A pgina deve classe de domnio, o que deve ser feito em um arquivo XML.
ficar com o cdigo semelhante ao apresentado na Listagem 5. Sendo assim, crie o arquivo hibernate.cfg.xml clicando com o boto
Neste arquivo podemos ver um formulrio simples conten- direito do mouse sobre a pasta src/main/resources e selecionando
do campos de texto e um boto que chama o mtodo salvar() Novo > Documento XML. O arquivo criado deve ser parecido com
do Managed Bean (linha 28). Na linha 7 observe a presena da o que mostra a Listagem 7.

Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia 31


Hibernate Validator: como validar objetos e ter mais controle sobre os dados

Listagem 7. Contedo do arquivo hibernate.cfg.xml. linhas 8 e 12 configurado o servlet do JSF, e entre as linhas 13 e
16 especificado o padro de URL atravs do qual o Servlet, dado
01. <hibernate-configuration>
02. <session-factory> em<servlet-name>, pode ser acessado.
03. <property name=hibernate.dialect> J o parmetro javax.faces.VALIDATE_EMPTY_FIELDS, vide
org.hibernate.dialect.MySQLDialect</property> linha 5, quando configurado como true, fora o JSF a acionar a
04. <property name=hibernate.connection.driver_class>
com.mysql.jdbc.Driver</property> validao de campos vazios, pois por padro o JSF trata os campos
05. <property name=hibernate.connection.url>jdbc:mysql://localhost:3306/ vazios como nulos.
empresabd?zeroDateTimeBehavior=convertToNull</property>
06. <property name=hibernate.connection.username>root</property>
07. <property name=hibernate.connection.password>1234</property> Criando a conexo com o banco de dados
08. <property name=hibernate.show_sql>true</property> Agora devemos criar dentro do pacote br.com.jm.projeto.util,
09. <mapping class=com.jm.entidade.Projeto />
a classe auxiliar HibernateUtil, responsvel por carregar as
10. </session-factory>
11. </hibernate-configuration> configuraes do hibernate.cfg.xml e implementar os mtodos de
controle das conexes e transaes com o banco. Seu cdigo fonte
pode ser visto na Listagem 9.
As propriedades que configuramos so explicadas a seguir: Observe que nessa classe temos apenas o atributo sessionFactory
dialect (linha 5): define o dialeto/linguagem com o qual o e o mtodo esttico getSessionFactory(), que cria uma SessionFac-
Hibernate se comunicar com a base de dados; tory para o Hibernate de acordo com o arquivo de configuraes.
connection.driver_class (linha 6): configura a classe do driver A partir disso, possvel instanciar objetos do tipo org.hibernate
JDBC; .Session que, por sua vez, sero utilizados para realizar as tarefas
connection.url (linha 7): determina a URL de conexo com o de persistncia do framework, como apresentado a seguir.
banco de dados;
connection.username (linha 8): local onde deve ser informado Listagem 9. Cdigo da classe HibernateUtil.
o nome do usurio para conexo com o banco;
connection.password (linha 9): local onde deve ser informada 01. package util;
02.
a senha; 03. //imports omitidos
show_sql (linha 10): opo que possibilita visualizarmos o 04.
script SQL gerado pelo Hibernate; 05. public class HibernateUtil {
06.
mapping (linha 11): local onde devemos indicar a(s) classe(s) 07. private static SessionFactory sessionFactory;
que est(o) mapeada(s) para viabilizar as operaes de persis- 08.
tncia/consulta. 09. public static SessionFactory getSessionFactory() {
10. if (sessionFactory == null) {
11. Configuration configuration = new Configuration().configure();
Listagem 8. Contedo do arquivo web.xml. 12. ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
13. .applySettings(configuration.getProperties()).build();
01. <welcome-file-list> 14. sessionFactory = configuration.buildSessionFactory(serviceRegistry);
02. <welcome-file>project_form.xhtml</welcome-file> 15. SchemaUpdate se = new SchemaUpdate(configuration);
03. </welcome-file-list>
16. se.execute(true, true);
04. <context-param>
17. }
05. <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
18.
06. <param-value>true</param-value>
22. return sessionFactory;
07. </context-param>
23. }
08. <servlet>
24.}
09. <servlet-name>Faces Servlet</servlet-name>
10. <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
11. <load-on-startup>1</load-on-startup>
12. </servlet>
13. <servlet-mapping> Persistindo a entidade Projeto
14. <servlet-name>Faces Servlet</servlet-name> Com a classe Projeto mapeada, os arquivos de configurao
15. <url-pattern>*.xhtml</url-pattern> definidos e a classe auxiliar implementada, vamos codificar as
16. </servlet-mapping>
operaes de persistncia. Para isso, crie a interface ProjetoDao
em um pacote de nome br.com.jm.projeto.dao.
Outro arquivo necessrio o web.xml, que contm as demais Para criar o pacote, clique com o boto direito do mouse sobre
configuraes do nosso projeto. Para cri-lo, clique com o boto o projeto hibernate-validator, escolha New > Package e informe seu
direito do mouse sobre a pasta WEB-INF, selecione Novo > Docu- nome. Em seguida, clique sobre ele, novamente com o boto di-
mento XML e defina seu nome. A Listagem 8 mostra o contedo reito, acesse New > Interface e d o nome de ProjetoDao. O cdigo
desse arquivo. fonte deve ficar semelhante ao apresentado na Listagem 10. Nele,
Note que dentro da tag <welcome-file>, na linha 2, definida podemos verificar todas as operaes que sero realizadas sobre
a pgina que ser tida como inicial pela aplicao. J entre as o banco de dados.

32 Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia


Feito isso, precisamos criar a classe para implementar essa Linha 9: A operao beginTransaction() inicia uma transao
interface. Assim, com o boto direito sobre o pacote br.com. com o banco de dados;
jm.projeto.dao, acesse New > Class e a nomeie como Projeto- Linha 10: O mtodo save() realiza a persistncia do objeto;
DaoImp (vide Listagem 11). Linha 11: O mtodo commit() finaliza a transao e a sesso
encerrada.
Listagem 10. Cdigo da interface ProjetoDao.

01. package br.com.jm.projeto.dao;


Os demais mtodos dessa classe (list(), remove() e update()) so
02. semelhantes ao save() e por isso analisaremos aqui apenas o que
03. //imports omitidos h de diferente no cdigo de cada um. Vejamos:
04.
05. public interface ProjetoDao {
Linha 22: O mtodo createCriteria() especifica uma query para
06. public void save(Projeto projeto); recuperar todos os objetos do tipo Projeto presentes no banco
07. public Projeto getProjeto(long id); de dados;
08. public List<Projeto> list();
09. public void remove(Projeto projeto); Linha 30: O mtodo delete() remove o objeto passado como
10. public void update(Projeto projeto); parmetro;
11. } Linha 37: O mtodo update() realiza a atualizao do objeto
Listagem 11. Cdigo da classe ProjetoDaoImp. passado como parmetro.

01. package br.com.jm.projeto.dao;


02.
Testando a aplicao
03. //imports omitidos Enfim, chegamos ao momento de testar a aplicao. Para isso,
04. clique com o boto direto sobre o projeto, acesse Run As > Run on
05. public class ProjetoDaoImp implements ProjetoDao {
06. Server, escolha o servidor Tomcat e clique em Finish.
07. public void save(Projeto projeto) { Ao iniciar a aplicao, a pgina inicial ser exibida. Para testar
08. Session session = HibernateUtil.getSessionFactory().openSession();
a implementao, clique no boto Enviar sem preencher qualquer
09. Transaction t = session.beginTransaction();
10. session.save(projeto); campo. Desta forma, podemos verificar se a validao de preen-
11. t.commit(); chimento obrigatrio est funcionando.
12. }
13. A Figura 8 mostra o resultado desse teste. Note que como nenhu-
14. public Projeto getProjeto(long id) { ma informao foi inserida nos campos do formulrio, o sistema
15. Session session = HibernateUtil.getSessionFactory().openSession(); alerta o usurio com algumas mensagens de erro.
16. return (Projeto) session.load(Projeto.class, id);
17. }
18.
19. public List<Projeto> list() {
20. Session session = HibernateUtil.getSessionFactory().openSession();
21. Transaction t = session.beginTransaction();
22. List lista = session.createQuery(from Projeto).list();
23. t.commit();
24. return lista;
25. }
26.
27. public void remove(Projeto projeto) {
28. Session session = HibernateUtil.getSessionFactory().openSession();
29. Transaction t = session.beginTransaction();
30. session.delete(projeto);
31. t.commit();
32. }
33.
34. public void update(Projeto projeto) {
35. Session session = HibernateUtil.getSessionFactory().openSession();
36. Transaction t = session.beginTransaction();
37. session.update(projeto);
38. t.commit();
39. }
40. }

Vejamos uma anlise das linhas mais importantes dessa classe:


Linha 7: O mtodo save() recebe como parmetro os dados do
projeto e realiza a insero deste no banco de dados;
Linha 8: A varivel do tipo Session recebe o resultado da chama-
da ao mtodo openSession(), que chamado a partir do retorno
do mtodo getSessionFactory(); Figura 8. Formulrio de cadastro de projeto em branco

Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia 33


Hibernate Validator: como validar objetos e ter mais controle sobre os dados

J em situaes em que todos os campos so preenchidos confor- Uma das grandes vantagens da Bean Validation API, e conse-
me o esperado e, portanto, nenhum erro de validao registrado quentemente do Hibernate Validator, o fato da validao ocor-
(vide Figura 9), o projeto internalizado no banco de dados e o rer no modelo de domnio da aplicao, de forma centralizada,
usurio redirecionado para a pgina de sucesso (Figura 10). evitando assim a reescrita de cdigo e tornando-o mais legvel,
o que facilita o trabalho do desenvolvedor durante tarefas de
implementao de novos recursos e manuteno.
Por fim, vale ressaltar que diversos frameworks para desenvol-
vimento web j fazem integrao com a Bean Validation, como
o caso do prprio Hibernate, utilizado em nosso exemplo, do
JPA, Spring e JSF. Isso mostra a importncia, o alcance e o nvel
de flexibilidade da API.

Autor
Carlos Alberto Silva
casilvamg@hotmail.com
formado em Cincia da Computao pela Universidade Federal
de Uberlndia (UFU), com especializao em Desenvolvimento
Java pelo Centro Universitrio do Tringulo (UNITRI) e em Anlise e De-
senvolvimento de Sistemas Aplicados a Gesto Empresarial pelo Instituto
Federal do Tringulo Mineiro (IFTM). Trabalha atualmente na empresa Algar Telecom como
Analista de TI. Possui as seguintes certificaes: OCJP, OCWCD e ITIL.

Links:

Site do Hibernate.
Figura 9. Formulrio de cadastro de projeto preenchido corretamente http://hibernate.org

Site do Hibernate Validator.


http://hibernate.org/validator/

Site do MySQL.
http://www.mysql.com/

Endereo para download do driver do MySQL.


http://dev.mysql.com/downloads/connector/j/

Endereo para download do Eclipse.


https://eclipse.org/downloads/

Endereo para download do JDK.


http://www.oracle.com/technetwork/java/javase/downloads
Figura 10. Pgina indicando o sucesso do cadastro
Endereo para download do Maven.
http://maven.apache.org/download.html

34 Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia


Copyright - Proibido copiar ou distribuir. Todos os direitos reservados para DevMedia 35