Escolar Documentos
Profissional Documentos
Cultura Documentos
Algaworks Livro Spring Boot v2.0 PDF
Algaworks Livro Spring Boot v2.0 PDF
2 Edio, 10/01/2017
LinkedIn: https://www.linkedin.com/in/normandesjr
Twitter: @normandesjr
Alexandre Afonso
Instrutor Java na AlgaWorks, graduado em Sistemas
de Informao, est no mercado de programao
Java h mais de 8 anos, principalmente no
desenvolvimento de sistemas corporativos.
LinkedIn: https://www.linkedin.com/in/alexandreafon
Twitter: @alexandreafon
Antes de comear...
Antes que voc comece a ler esse livro, eu gostaria de combinar algumas coisas
com voc, para que tenha um excelente aproveitamento do contedo. Vamos l?
http://alga.works/comunidadejava/
Ajude a divulgar esse livro para seus amigos que tambm se interessam por
programao Java. Compartilhe no Facebook e Twitter!
Sumrio
1 Introduo
2 O Spring
2.1 Introduo ................................................................................................... 12
4 Publicando a aplicao
4.1 Introduo ................................................................................................... 52
5 Concluso
5.1 Prximos passos ......................................................................................... 61
Captulo 1
Introduo
s vezes a parte mais difcil para quem est comeando uma nova aplicao Java
web, mesmo se esse programador j conhece a linguagem, justamente comear!
Voc precisa criar a estrutura de diretrios para os vrios arquivos, alm de criar
e configurar o build file com as dependncias.
Se voc j programador Java para web, sempre que precisa criar um novo
projeto, o que voc faz? possvel que sua resposta seja: eu crio um novo projeto
e vou copiando as configuraes de outro que j est funcionando.
Se voc iniciante, seu primeiro passo ser procurar algum tutorial que te ensine
a criar o projeto do zero, e ento copiar e colar todas as configuraes no seu
ambiente de desenvolvimento at ter o hello world funcionando.
Ns vamos criar uma aplicao simples com Spring Boot, Spring MVC, Spring
Data JPA, Spring Security e Thymeleaf usando o Spring Tool Suite (STS), uma
IDE baseada no Eclipse que vem com o Spring Initializr (no est escrito errado,
Initializr mesmo), uma ferramenta muito til para criar nossos projetos com
Spring.
www.algaworks.com 11
Captulo 2
O Spring
2.1. Introduo
Existem muitas reas cobertas pelo ecossistema Spring, como Spring Data para
acesso a banco de dados, Spring Security para prover segurana, e diversos
outros projetos que vo de cloud computing at big data.
O Spring surgiu como uma alternativa ao Java EE, e seus criadores sempre se
preocuparam para que ele fosse o mais simples e leve possvel.
O Spring no chega a ser 100% concorrente do Java EE, at porque, com Spring,
voc tambm usa tecnologias que esto dentro do Java EE.
www.algaworks.com 12
Mas existem programadores que preferem trabalhar com os projetos do Spring, e
outros que preferem trabalhar com as especificaes do Java EE, sem Spring.
Ele o projeto do Spring que serve de base para todos os outros, talvez por isso
haja essa pequena confuso.
Ele foi pensado para que nossas aplicaes pudessem focar mais na regra de
negcio e menos na infraestrutura.
O Spring MVC
Suporte para JDBC, JPA
Injeo de dependencias (Dependency injection DI)
O Spring MVC, que falaremos melhor mais para frente, um framework para
criao de aplicaes web e servios RESTful. Ele bastante conveniente, pois,
muitas das aplicaes que construmos hoje em dia precisam atender requisies
web.
Com o mesmo pensamento do Spring MVC, temos o suporte para JDBC e JPA.
Isso porque persistncia tambm um recurso muito utilizado nas aplicaes.
difcil conceber uma aplicao hoje que no grave ou consulte algum banco de
dados.
www.algaworks.com 13
Por ltimo, assim como o Spring Framework a base do ecossistema, a injeo
de dependncias a base do Spring Framework. Imagino que os projetos Spring
seriam quase que uma baguna caso esse conceito no tivesse sido
implementado.
...
}
www.algaworks.com 14
@Autowired
private RepositorioCliente repositorio;
...
}
A priore pode parecer insignificante, mas o Spring no para por ai. Tem vrias
outras funcionalidades que so possveis ou, pelo menos, facilitadas por causa da
injeo de dependncias.
Vamos parar um pouco e pensar no que fazemos todos os dias quando estamos
na internet.
Mas, o que acontece entre o Enter e a pgina HTML ser renderizada? Claro que
existem centenas de linguagens de programao e frameworks diferentes, mas
ns vamos pensar no contexto do Spring MVC.
www.algaworks.com 15
1. Acessamos uma URL no browser que envia a requisio HTTP para
o servidor que roda a aplicao web com Spring MVC. Esse servidor
pode ser o Apache Tomcat, por exemplo. Perceba que quem recebe a
requisio o controlador do framework, o Spring MVC.
3. O controller passa os dados para o model, que por sua vez executa todas as
regras de negcio, como clculos, validaes e acesso ao banco de dados.
5. O controller retorna o nome da view, junto com os dados que ela precisa
para renderizar a pgina.
Pare um pouco e volte na figura acima, leia mais uma vez todos os passos desde
a requisio do browser, at a pgina ser renderizada de volta a ele.
Como voc deve ter notado, temos o Controller tratando a requisio, ele o
primeiro componente que ns vamos programar para receber os dados enviados
pelo usurio.
www.algaworks.com 16
Mas muito importante estar atento e no cometer erros adicionando regras
de negcio, acessando banco de dados ou fazendo validaes nessa camada,
precisamos passar essa responsabilidade para o Model.
www.algaworks.com 17
Spring Data for Apache Solr
Mas aqui ns vamos focar no mais utilizado, que o Spring Data JPA.
O suporte do Spring Framework para JPA j muito bom, mas o projeto Spring
Data JPA vai bem alm. Ele ajuda os desenvolvedores padronizando o uso de
algumas funcionalidades, e isso faz com que tenhamos menos esforo para
implementar as mesmas coisas de antes.
Esse exemplo no foi dado toa. Mais para frente, faremos o uso da interface
JpaRepository que nos ajudar com essa funcionalidade.
Spring Security torna bem simples a parte de autenticao. Com algumas poucas
configuraes j podemos ter uma autenticao via banco de dados, LDAP ou
mesmo por memria. Sem falar nas vrias integraes que ele j suporta e na
possibilidade de criar as suas prprias.
Quanto a autorizao, ele bem flexvel tambm. Atravs das permisses que
atribumos aos usurios autenticados, podemos proteger as requisies web
(como as telas do nosso sistema, por exemplo), a simples invocao de um
mtodo e at a instncia de um objeto.
www.algaworks.com 18
2.8. O Spring Boot
Mas mesmo com configurao via cdigo Java, que trouxe benefcios, como evitar
erros de digitao, pois a configurao agora precisa ser compilada, ainda assim
precisvamos escrever muito cdigo explicitamente.
Talvez a maior revoluo e o maior acerto dos projetos Spring, foi o Spring Boot.
Com ele voc alcana um novo paradigma para desenvolver aplicaes Spring
com pouco esforo.
Vale destacar que, toda essa mgica que o Spring Boot traz para o
desenvolvimento Spring, no realizado com gerao de cdigo. No, o Spring
Boot no gera cdigo! Ele simplesmente analisa o projeto e automaticamente o
configura.
www.algaworks.com 19
2.9. O Thymeleaf
A view ir retornar apenas um HTML para o browser do cliente, mas isso deixa
uma dvida: Como ela recebe os objetos Java, enviados pelo controller, e os
transforma em HTML?
O Thymeleaf no um projeto Spring, mas uma biblioteca que foi criada para
facilitar a criao da camada de view com uma forte integrao com o Spring, e
uma boa alternativa ao JSP.
Para voc ver como ele funciona, vamos analisar o cdigo abaixo.
Dentro de cada tr existem 2 elementos td. O texto que eles iro exibir vem do
atributo th:text, junto com a expresso ${}, lendo as propriedades da varivel
local convidado.
www.algaworks.com 20
2.10. O Maven
Mas talvez o que mais fez o Maven ter sucesso, foi o gerenciamento de
dependncias. muito bom poder escrever algumas linhas e j ter a biblioteca
disponvel para o nosso projeto.
Para saber mais sobre como comear com o Apache Maven, recomendo
voc assistir esta videoaula gratuita no blog da AlgaWorks.
http://blog.algaworks.com/comecando-com-apache-maven-em-projetos-
java
O Spring Tool Suite, ou STS, um Eclipse com vrios plugins teis para o
trabalho com o Spring.
www.algaworks.com 21
A instalao como a do Eclipse, basta baixar e descompactar.
Mas se voc j tem uma certa experincia e gosta de outra IDE, no se preocupe,
existe uma alternativa para a criao dos seus projetos Spring, basta acessar o
Spring Initializr online em http://start.spring.io.
www.algaworks.com 22
Nesse site voc consegue quase a mesma facilidade que vamos alcanar
utilizando o STS. Nele voc informa os dados do projeto, frameworks e
bibliotecas que deseja ter como dependncia, ento um projeto Maven ser
gerado para ser importado na sua IDE.
www.algaworks.com 23
Captulo 3
O projeto de gesto de
convidados
3.1. Funcionamento
Vamos criar uma aplicao simples, do zero e passo a passo para voc ver como
o Spring Boot, o Spring MVC, o Spring Data JPA, o Spring Security e o Thymeleaf
funcionam juntos, e para isso vamos usar o Spring Tool Suite e o Maven.
Nossa aplicao ser til para a gesto de convidados em uma festa. Precisamos
do nome do convidado principal e a quantidade de acompanhantes que vm com
ele.
Na aplicao, teremos uma nica tela com dois campos de texto de entrada,
um para informar o nome do convidado e o outro para dizer a quantidade
de acompanhantes. Por exemplo, podemos cadastrar que o Joo levar 2
acompanhantes.
Tambm teremos um boto Adicionar e uma tabela para mostrar o que j foi
cadastrado. Veja como ser a verso final na imagem abaixo.
www.algaworks.com 24
3.2. Criando o projeto no STS
Com o STS aberto, clique em File -> New -> Spring Starter Project, como mostra a
figura abaixo.
www.algaworks.com 25
Em Packaging, pode deixar o Jar
Para Java Version, selecione a verso do Java que est configurada para
seu ambiente (recomendo que voc use a verso 1.8)
www.algaworks.com 26
Agora hora de selecionarmos os frameworks ou bibliotecas que nosso sistema
precisa. Navegue um pouco pelas opes clicando nas pequenas setas, como em
Database, e veja as opes que so possveis selecionarmos.
Essa tela muito til para iniciarmos o desenvolvimento da nossa aplicao, pois
ela a base para o STS gerar o arquivo pom.xml, ou seja, ao invs de voc ter
que lembrar o nome completo das dependncias do Spring MVC, pode apenas
selecionar Web.
www.algaworks.com 27
Ateno: Se essa for a primeira vez que voc faz este procedimento, pode
demorar um pouco, pois muitas bibliotecas sero baixadas da internet.
www.algaworks.com 28
Em src/main/javavoc encontra o pacote com.algaworks.festa com a classe
GestaoFestaApplication. Vamos analisar o cdigo dela agora:
package com.algaworks.festa;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class GestaoFestaApplication {
Talvez voc tenha ficado com uma dvida agora, pensando assim: mas esse
livro no iria me ensinar sobre Spring MVC, que uma aplicao web? Cad o
servidor web pra executar, algo como o Apache Tomcat?.
Tudo bem se voc pensou isso, mas sim uma aplicao web.
www.algaworks.com 29
Acontece que o Spring Boot usa um container embarcado (por padro o
Tomcat) para facilitar o desenvolvimento, ento para iniciar nossa aplicao,
basta executarmos o mtodo main da classe GestaoFestaApplication.
@SpringBootApplication
Ela diz que a classe faz parte da configurao do Spring. Poderamos adicionar
configuraes customizadas, por exemplo, definir o idioma ou at fazer
redirecionamentos caso no encontre uma pgina, mas como j vimos, o Spring
Boot define muitos comportamentos padronizados, e no precisaremos alterar
nada para ter a aplicao funcionando.
www.algaworks.com 30
importante estar atento ao pacote que a classe ir ficar.
Para deixar nosso cdigo organizado, todo controller dever ficar dentro do
pacote com.algaworks.festa.controller.
www.algaworks.com 31
O cdigo muito simples. Primeiro vamos anotar a classe com @Controller para
dizer que ela um componente Spring, e que um controller.
package com.algaworks.festa.controller;
import org.springframework.stereotype.Controller;
@Controller
public class ConvidadosController {
www.algaworks.com 32
Vamos chamar este mtodo de listar(), pois ele ser responsvel por listar os
convidados para mostrarmos na view mais a frente.
Esse mtodo pode retornar uma String, que o nome da view que iremos criar
daqui a pouco, chamada de ListaConvidados.
Ok. Mas agora surge uma dvida: qual URL que podemos digitar no browser
para esse mtodo ser chamado?
@GetMapping("/convidados")
public String listar() {
return "ListaConvidados";
}
A configurao default do Spring Boot com Thymeleaf, define que a view deve
ficar em src/main/resources/templates e o sufixo do arquivo ser .html.
www.algaworks.com 33
Importante, o nome da view faz parte do nome do arquivo, informe
ListaConvidados.html em File Name.
<properties>
<!-- ... -->
<thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.0.4</thymeleaf-layout-dialect.version>
</properties>
spring.thymeleaf.mode=html
spring.thymeleaf.cache=false
www.algaworks.com 34
Para vermos algo funcionando o mais rpido possvel, vamos criar uma pgina
simples com o Thymeleaf.
Para deixar nosso sistema mais bonito, vamos usar o Bootstrap. Iremos usar
tambm a biblioteca WebJars, que vai nos permitir gerenciar os recursos (CSS e
JS) necessrios do Bootstrap atravs do nosso arquivo pom.xml.
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width" />
<title>Lista de Convidados</title>
<link th:href="@{/webjars/bootstrap/css/bootstrap.min.css}"
rel="stylesheet"/>
<link th:href="@{/webjars/bootstrap/css/bootstrap-theme.min.css}"
rel="stylesheet"/>
</head>
<body>
<h1>AlgaWorks!</h1>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<input type="text">
www.algaworks.com 35
O cdigo acima funciona normalmente em um HTML comum, mas no em um
XHTML, portanto lembre-se sempre de abrir e fechar suas tags:
<input type="text"></input>
<link th:href="@{/webjars/bootstrap/css/bootstrap.min.css}"
rel="stylesheet"/>
<link th:href="@{/webjars/bootstrap/css/bootstrap-theme.min.css}"
rel="stylesheet"/>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>3.3.7</version>
</dependency>
www.algaworks.com 36
3.5. Rodando o projeto pela primeira vez
J temos algo executvel, nada funcional ainda, mas j podemos ver algo
rodando no browser e ficar felizes por termos nossa aplicao funcionando at
agora.
www.algaworks.com 37
Vamos testar?
Essa URL far com que o Spring MVC chame o mtodo listar() do controller
ConvidadosController, que por sua vez retorna ListaConvidados, que o nome
da view ListaConvidados.html, que enviar para o cliente a pgina HTML.
Agora hora de sofisticar um pouco nossa aplicao. Vamos criar uma classe que
representar cada convidado e um repositrio para armazen-los e busc-los.
www.algaworks.com 38
Crie a classe Convidado no pacote com.algaworks.festa.model.
package com.algaworks.festa.model;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Convidado implements Serializable {
@Id
@GeneratedValue
private Long id;
A anotao @Entity torna a nossa classe como uma entidade de banco de dados.
As anotaes @Id e @GeneratedValue so para marcar a propriedade id como
representante da chave primria do banco e para pedir que o Hibernate (nossa
implementao por trs do JPA) gere o identificador para ns, respectivamente.
O projeto Spring Data JPA, atravs da interface JpaRepository, vai tornar essa
tarefa uma das mais fceis do nosso projeto. Veja o nosso repositrio:
www.algaworks.com 39
package com.algaworks.festa.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.algaworks.festa.model.Convidado;
E, para o leitor mais atento, essas duas classes, Convidado e Convidados, fazem
parte do Model no padro MVC.
package com.algaworks.festa.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
import com.algaworks.festa.repository.Convidados;
@Controller
public class ConvidadosController {
www.algaworks.com 40
@Autowired
private Convidados convidados;
@GetMapping("/convidados")
public ModelAndView listar() {
ModelAndView modelAndView = new ModelAndView("ListaConvidados");
modelAndView.addObject("convidados", convidados.findAll());
return modelAndView;
}
}
Repare que com @Autowired, podemos injetar o repositrio no controller, e isso nos
livra da preocupao de como receber esse objeto na classe.
Veja tambm a anotao @GetMapping que anota o nosso mtodo listar(). Ela
diz que nosso mtodo ir responder a requisio HTTP do tipo GET para
/convidados.
Como j importamos o bootstrap, vamos us-lo para deixar a pgina mais bonita.
Para este exemplo vamos utilizar o Panel with heading, que consiste em um
painel com um cabealho e um corpo.
<body>
<div class="panel panel-default" style="margin: 10px">
<div class="panel-heading">
<h1 class="panel-title">Lista de convidados</h1>
</div>
www.algaworks.com 41
<div class="panel-body">
<table class="table">
<thead>
<tr>
<th>Nome</th>
<th>Acompanhantes</th>
</tr>
</thead>
<tbody>
<tr>
<td>Joo</td>
<td>3</td>
</tr>
</tbody>
</table>
</div>
</div>
</body>
Repare que na tag tbody existe uma linha tr, mas o que queremos iterar sobre a
lista que o controller disponibilizou para a view, ao invs de deixar fixo como est.
Precisamos de algo que itere e gere vrias linhas (tr) e, nas colunas (td), permita
inserir o nome e a quantidade de acompanhantes do convidado.
Agora que o Thymeleaf entra em ao! Vamos usar dois atributos, o th:each
e o th:text. O primeiro para iterar sobre a lista e o segundo para mostrar as
propriedades do objeto nas colunas.
www.algaworks.com 42
Antes dos dois pontos, criamos uma varivel local para podermos usar na
iterao. Repare que nas colunas, no atributo th:text usamos ${convidado.nome}
para mostrar o nome do convidado no contedo da coluna.
S precisamos criar o arquivo import.sql e mais nada. Isso porque o Spring Boot
vai se encarregar de repassar esse arquivo ao Hibernate (nossa implementao de
JPA) para que ele o execute.
www.algaworks.com 43
3.9. Adicionando um convidado
Agora que nosso HTML est pronto, vamos comear as modificaes para o
Thymeleaf e o Spring conseguirem salvar um novo convidado.
Esse objeto chamado de command object, que o objeto que modela o formulrio,
ou seja, ele que ser setado com os valores das tags input da pgina.
mv.addObject(new Convidado());
www.algaworks.com 44
E nos campos de entrada vamos usar as propriedades do objeto convidado nos
inputs usando th:field.
Para finalizar nosso formulrio, precisamos apenas dizer para qual endereo ele
deve enviar os dados. Vamos fazer isso usando o atributo th:action.
Nosso formulrio est pronto, podemos ver que ele ser enviado via POST para
o endereo /convidados.
@PostMapping("/convidados")
public String salvar(Convidado convidado) {
www.algaworks.com 45
Com o objeto pronto, podemos simplesmente adicion-lo ao repositrio.
@PostMapping("/convidados")
public String salvar(Convidado convidado) {
this.convidados.save(convidado);
}
muito simples fazer isso com o Spring MVC, ao invs de retornarmos o nome
da view que queremos renderizar, podemos retornar uma URL para redirecionar
a requisio usando redirect: na String.
@PostMapping("/convidados")
public String salvar(Convidado convidado) {
this.convidados.save(convidado);
return "redirect:/convidados";
}
No mtodo acima, a string redirect:/convidados faz com que o browser faa uma
nova requisio GET para /convidados, fazendo com que a tabela seja atualizada
com a nova pesquisa.
@Controller
@RequestMapping("/convidados")
public class ConvidadosController {
@GetMapping
public ModelAndView listar() {
// ...
}
@PostMapping
public String salvar(Convidado convidado) {
www.algaworks.com 46
// ...
}
}
Como estamos fazendo o uso do JPA (atravs do Spring Data JPA), configurar e
at mesmo trocar o banco de dados se torna uma tarefa bem simples.
Mais no incio, quando criamos o nosso projeto, voc deve ter visto que
adicionamos a dependncia do banco de dados H2. Isso facilitou nosso trabalho
at aqui.
www.algaworks.com 47
Ele um banco de dados em memria e foi escolhido para simplificar o
desenvolvimento do nosso projeto por dois motivos. Primeiro porque ele no
precisa ser instalado, e segundo porque no precisamos de configurao alguma
para utiliz-lo com Spring Boot. Muito bom, no mesmo?
Agora, a gente sabe que muitos vo querer utilizar um banco de dados diferente,
e vamos fazer isso agora. Iremos configurar o nosso projeto com o MySQL.
Alm dessas pequenas configuraes que sero feitas a partir de agora ajudarem
aqueles que querem o prprio MySQL, vo servir como exemplo para quem
precisar da configurao para outros bancos quaisquer.
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
Depois voc configura a URL, o usurio e a senha do seu banco no arquivo src/
main/resources/application.properties:
spring.datasource.url=jdbc:mysql://localhost/comecandocomspringmvc
spring.datasource.username=root
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=create-drop
www.algaworks.com 48
3.11. Deixando a aplicao segura
Como foi dito no incio, ele simplifica bem o nosso trabalho. E, se estiver fazendo
parceria com o Spring Boot (como o nosso caso), ento temos mais facilidades
ainda.
Faremos isso agora. Para isso precisamos somente dessa dependncia em nosso
pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
S de adicion-la, j criado o usurio user com uma senha que temos que copiar
do console toda vez que subimos a aplicao.
www.algaworks.com 49
package com.algaworks.festa.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication
.builders.AuthenticationManagerBuilder;
@Configuration
public class InMemorySecurityConfig {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder builder)
throws Exception {
builder
.inMemoryAuthentication()
.withUser("normandes").password("123").roles("USER")
.and()
.withUser("alexandre").password("123").roles("USER")
.and()
.withUser("thiago").password("123").roles("USER");
}
}
www.algaworks.com 50
www.algaworks.com 51
Captulo 4
Publicando a aplicao
4.1. Introduo
Esse captulo ser como a cereja do bolo. Veremos como fazer a publicao do
nosso projeto na nuvem, simulando que estamos colocando ele em produo.
Basicamente, teremos que preparar nosso projeto para funcionar com o banco
de dados Postgres. Depois iremos precisar de duas instalaes sobre as quais
rodaremos os comandos para publicao do projeto.
O Heroku tem sim o MySQL, mas para colocar ele em nossa aplicao ser
preciso fazer a confirmao da nossa conta.
www.algaworks.com 52
Quem quiser confirmar a conta para utilizar o MySQL, pode ficar tranquilo
que no ser cobrado imediatamente por isso. A cobrana vir somente se for
feito um upgrade explcito no dashboard do Heroku ou atravs de comandos de
alterao dos tipos de hospedagem.
Para os que preferirem o MySQL, iremos tambm, nesse captulo, ver sobre as
adaptaes que sero necessrias.
Da mesma forma que foi com o MySQL, ser simples utilizar o Postgres em nossa
aplicao.
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
spring.datasource.url=${JDBC_DATABASE_URL}
spring.datasource.username=
spring.datasource.password=
www.algaworks.com 53
Uma ltima coisa aqui, que ser necessrio o arquivo heroku-db.properties
mesmo para quem for utilizar o MySQL no Heroku. Obviamente, para essas
pessoas, no ser preciso a dependncia do Postgres.
Nossa entidade est utilizando a estratgia padro para gerao da nossa primary
key de banco de dados. Veja a anotao @GeneratedValue:
@Id
@GeneratedValue
private Long id;
Sabemos que uma sequence comea com o valor 1. E aqui que vem o problema
do nosso projeto, pois, ns j temos a primary key de identificador igual a 1 no
arquivo import.sql.
@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
private Long id;
Essa nova estratgia vai, simplesmente, fazer uma consulta na base de dados do
tipo max(id) + 1 para buscar a prxima primary key. Com isso o problema anterior
eliminado.
Essa foi a forma escolhida para resolver essa questo, mas existem algumas
outras.
www.algaworks.com 54
Para quem for utilizar o MySQL no Heroku, esse tpico opcional.
Nesse arquivo iremos incluir o comando que o Heroku vai utilizar para iniciar
nossa aplicao.
Para subir o projeto para o Heroku, vamos precisar do Git. Voc pode baix-lo no
site https://git-scm.com/downloads e a instalao bem simples.
www.algaworks.com 55
De qualquer forma, os comandos que vou apresentar agora devero ser dados
pelo terminal (ou cmd do Windows), mais especificamente, de dentro da pasta
do projeto.
$ cd /pasta/do/projeto/gestao-festa
$ git init
$ git add .
target/
.settings/
.classpath
.project
Ainda ser dado mais um comando com o Git, mas antes precisamos configurar
nossa aplicao no Heroku.
www.algaworks.com 56
Feito o cadasto, j podemos instalar o Heroku CLI. Os detalhes dessa instalao
para cada sistema operacional, voc encontra em
https://devcenter.heroku.com/articles/heroku-cli.
$ cd /pasta/do/projeto/gestao-festa
$ heroku login
Ser pedido um usurio e senha para voc. So os mesmos que voc informou no
cadastro dentro do site.
Usamos o comando create para isso. O parmetro passado o nome que nossa
aplicao ir ter no Heroku. O nome no obrigatrio e se no for passado, um
aleatrio ser gerado para voc.
O nome de uma aplicao no Heroku deve ser nico em todo o mundo! Caso
voc utilize um que j existe, receber uma mensagem de erro. A dica voc ter
um prefixo seu assim como foi feito acima. Veja que foi utilizado o prefixo aw
de AlgaWorks juntamente com o nome que gestao-festa.
Criamos a aplicao, mas o banco de dados ainda precisa ser adicionado. Como
voc j sabe, ns vamos adicionar o Postgres:
Para quem confirmou a conta e quer utilizar o MySQL, basta adicionar o addon:
www.algaworks.com 57
At aqui temos a aplicao e o banco configurados, basta enviar ela agora com o
comando push do Git. J vamos fazer isso.
Se voc seguiu todos os passos at aqui, ento est pronto para enviar sua
aplicao.
No momento em que criamos a nossa aplicao com heroku create foi adicionado
um repositrio remoto, de nome heroku, nas configuraes do nosso repositrio
local do Git.
Logo depois desse comando, o que voc deve ver no seu terminal algo parecido
com a figura abaixo:
www.algaworks.com 58
comando open do Heroku CLI, que ele j abre o browser no endereo correto para
voc.
$ heroku open
Lembrando que, depois que o browser se abrir, voc ainda deve acessar o
contexto /convidados.
Tenho s mais dois comandos do Heroku que acho interessante que voc
conhea. Um o logs --tail e o outro o ps.
O comando logs --tail, bem intuitivo, serve para exibir os logs a medida que
forem ocorrendo dentro da sua aplicao.
Por ltimo, o comando ps serve para que voc veja alguns detalhes sobre a sua
hospedagem. Ao execut-lo:
www.algaworks.com 59
As informaes mais importantes mostradas acima so o tipo de hospedagem
que estamos utilizando (free, no caso) e a quantidade de horas que temos
disponveis para utilizar no ms corrente com o tipo gratuito de hospedagem.
www.algaworks.com 60
Captulo 5
Concluso
Que legal ter chegado ao final da leitura, estamos felizes por voc ter cumprido
mais essa etapa na sua carreira.
Se voc gostou desse livro, por favor, ajude a manter esse trabalho. Recomende
para seus amigos de trabalho, faculdade e/ou compartilhe no Facebook e
Twitter.
Embora esse livro tenha te ajudado a criar uma aplicao do incio ao fim com
Spring Boot, Spring MVC, Spring Data JPA, Spring Security e Thymeleaf, o que
voc aprendeu nele s a ponta do iceberg!
claro que voc no perdeu tempo com o que acabou de estudar, o que ns
queremos dizer que h muito mais coisas para aprofundar.
Caso voc tenha interesse em continuar seu aprendizado, recomendo que veja
agora um curso online que temos sobre Spring nesse link: http://alga.works/
livro-spring-boot-cta/.
www.algaworks.com 61