Criando primeiro endpoint com Spring Boot

Criando primeiro endpoint com Spring Boot

Start

Olá, talvez o ecossistema spring seja o mais completo da atualidade, esse ecossistema cada vez vem melhorando e refinando, temos um mundo de empresas que o utilizam e quando falamos de microserviços spring é fantástico.

Por onde podemos começar a utilização do spring, bem antigamente era bem complicado para configurar o spring como aplicação para se trabalhar com web, eu mesmo sofri um pouco com xml na epoca da faculdade rsrsrs, mas o pessoal do spring teve uma ideia muito boa, visto que a maioria das aplicações tem a mesma configuração, por que não utilizar configuração por convenção? o spring boot ajuda nisso, com seus componentes pré configurados ficou muito fácil sair utilizando todo poder que o ecosistema spring nos dá.

instalando plugin vs-code

Se você já tem uma IDE configurada pode pular essa parte, agora se está começando poderá instalar esses plugins no vs-code marketplace.visualstudio.com/items?itemName.. A partir de agora você está apto a rodar projetos spring no vs-code, não tem mistério, se preferir utilizar o spring.io/tools ou jetbrains.com/pt-br/idea fique a vontade pois são ótimas escolhas também.

Start project

Hoje temos o start.spring.io e vale muito a pena conhecer, esse site tem a capacidade de gerar projetos para a plataforma spring.

Mas vamos seguir o caminho de pegar um projeto pré configurado, onde podemos apenas escrever a entidade, controller e repositorio, mas se você pensou, eu não sei o que é isso, fica tranquilo que no caminho você vai aprender.

Link para o repositorio pré configurado: github.com/andremartds/spring_boot_pre_conf..

Estrutura do projeto

Screenshot from 2021-12-19 17-22-03.png

Se você já entende dos pakages do java, esse entendimento vai ser tranquilo, basicamente temos: main: pasta principal do projeto java: sendo nosso contexto da aplicação java com/andremartds/cadastro: contexto do nosso endpoint

Logo dentro de cadastro temos, controllers, exceptionHandler, model, repository, services e nosso ponto de entrada da aplicação que no caso é esse arquivo App.java

code.png

Perceba o quanto é simples esse arquivo, ele apenas chama a classe do SpringApplication e nossa aplicação será inicializada, não vamos entrar em detalhes mais profundos nesse ponto, precisamos subir nossa api o mais rápido possível.

Entidade ou Model

No java assim como em outras linguágens podemos ter representações de tabelas do banco de dados em nossa aplicação, e isso facilita o dia dia, imagine que pra acessar seu banco de dados sempre tivesse que escrever querys na mão, quão verboso sua api seria, é claro que as vezes é necessário, sem mais delongas vamos a nossa entidade de pessoa.

pessoa-entity.png

Nada demais, aqui estamos mapeando nossa entidade com seus atributos, vamos passar por cada um deles

codigo

O código anotamos com a anotação @Id e @GeneratedValue(strategy = GenerationType.IDENTITY) resumindo essas anotação farão com que seja criado o codigo no banco de dados, esse código será auto incrementável, ou seja, 1, 2, 3...

nome

Para o nome temos logo acima do mesmo, @NotNull essa anotação faz a uma validação onde não poderá ser um campo indefinido, sem valor ou nulo. Temos também o @size(min=3, max=50) com isso só pode ter o mínimo de caracteres de 3 a 50

Endereco

Aqui temos uma pequena curiosidade, no caso estamos utilizando o @Embedded estamos instruindo o código a aceitar esse embedável, que estamos tratando em outra classe.

endereco-entity.png

Nessa classe anotamos a mesma com @Embeddable ou seja ela poderá ser embedada por um @Embedded pegou a ideia? Dessa forma estamos colocando na mesma tabela do banco de dados, porém estamos trabalhando com responsabilidades separadas no codigo.

ativo

Por último temos o ativo que se trata de um boleano, não tem mistérios.

Repository

Logo a baixo da pasta model temos a pasta Repository, e uma das maiores vantágens de se trabalhar com o padrão repository é o fato de podermos extender todo os métodos do SpringDataJpa, você pode pensar, que vantágem tem isso? com o SpringDataJpa você passa a ter super poderes e é muito provável que ele resolva a maioria de suas chamadas ao banco de dados.

repository.png

Tão simples quanto isso, basta criar a interface extender JpaRepository Passando Pessoa e o tipo de seu Id, no caso Long.

ExceptionHandler

não vou me alongar muito na explicação do exceptionHandler, vamos resumir em uma frase. Responsável por capturar as exceções e tratá-las, deixando mais limpo, service ou controller.

Na verdade não precisava nesse primeiro momento trabalharmos com esse tipo de captura de exception, vou deixar o código mais como exemplo mesmo, hehe.

Controller

Controller ou Resource é onde vamos trabalhar com toda a camada dos dados que entram para o nosso endpoint, nesse caso que entram por '/pessoas'

pessoa.png

De cara vemos algumas coisas interessantes, a primeira é como o spring trabalha para dizer que esse arquivo é um controller, então adicionamos a anotação @RestController e logo abaixo temos a @RequestMapping("/pessoas") que é responsável por adicionar a URI de entrada para esse endpoint

Autowired

Utilizamos essa anotação para injetarmos algo no contexto do spring, e nesse caso estamos injetando aquele repository que terá todos os métodos para utilizarmos e também estamos injetando o service de pessoas que já vamos detalhar.

Todos Usuarios

Esse método tem a reponsabilidade de retornar todos os usuários, nesse caso estamos utilizando os artificios do nosso repository para trazer tudo, e já estamos jogando isso para uma lista de pessoas.

Buscar Por Código

Esse metodo tem a finalidade de trazer uma pessoa por seu código, perceba que adicionamos o @GetMapping("/{codigo}") e dessa forma vamos estar prontos para pegar uma variável com o @PathVariable que no caso foi o proprio codigo, depois utilizamos os recursos adicionados no java 8 para fazer o map com uma lambda, trazendo todos os registros se ok e se não nada foi encontrado.

Adicionando Pessoa

Esse método vamos adicionar uma pessoa no nosso banco de dados, perceba que nos argumentos da função estamos passando @valid essa anotação fará com que aquelas validações que colocamos dentro da entidade sejam verificadas, no final retornamos o ResponsyEntity passando o Status http como create e o body que foi a própria pessoa salva.

Remover Pessoa

Esse método tem por finalidade remover a pessoa selecionada, pegamos o codigo só que agora com o @deleteMapping("/{codigo}") e vamos dar a resposta com o httpStatus no content assim, não irá retornar nada do que foi removido, que é o correto, já que o registro não existe mais.

Atualizar Pessoa e Atualizar pessoa parcialmente

Para atualizar uma pessoa também é muito simples, só que nesse caso vamos utilzar o service, que no dia a dia é bem mais comun, afinal não dá pra deixar regras de negócio na camada do controller, então passamos para nosso service no método atualiza pessoa o codigo e a pessoa que veio na requisição put.

service.png

No caso da atualização de pessoa, estamos fazendo o trabalho duro no service, estamos seguindo o mesmo comportamento anterior dos outros métodos só que no service retornando para o controller, imagine se sua aplicação tivesse várias validações para atualizar uma pessoa, não seria justo nem bonito deixar o código no controller.

Por fim temos a atualização com o patch, atualizar com esse verbo significa que será uma atualização parcial, isso é sempre bom quando possível afinal estamos poupando recursos, no caso desse método trabalhamos com o mesmo comportamento, recebemos o id em @patchMapping("/{codigo}/ativo") só que a diferença é que estamos enviando no body, true ou false, dessa forma setamos apenas esse valor para a entidade.

Screenshot from 2021-12-19 18-17-44.png

A importação dos arquivos do postman estão zipados dentro do projeto.

obrigado pela leitura.