Sumrio
04 - JavaFX 8: Uma introduo arquitetura e s novidades da API
[ Daniel Assuno Faria de Menezes ]
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
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.
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:
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
@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) {
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().
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
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.
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
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.
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. }
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:
Cdigo do Artigo.
https://github.com/marcosvidolin/jm-ArquiteturaDeMicroservicesComSpringBoot
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
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.
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.
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
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.
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.
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 MySQL.
http://www.mysql.com/