0

ELABORACAO DE API REST EM SPRING

Douglas Assunção
Douglas Assunção


 O mundo da programação evolui constantemente e as ferramentas para facilitar a produção também. Com isso a linguagem Java, uma das mais significativas e conhecidas desse universo, sempre ganha mais frameworks (ferramentas de código prontas para código rápido e preciso). Temos assim o Spring que revolucionou esta linguagem e é usado no mundo todo. Conforme o sistema vai ganhando tamanho e complexidade, as funções e entidades (classes) vão se tornado mais acopladas trazendo mais dificuldade para novas implementações e se tornado menos performáticas, nesse sentido, o Spring torna isso menos trabalhoso fazendo automaticamente a injeção de dependências e utilizando apenas ferramentas necessárias.

Quando começamos a desenvolver um sistema, uma das tarefas mais difíceis é pensar em como os dados ficarão organizados e como iremos guarda-los e acessa-los. Atualmente, as informações são guardadas em banco de dados, como o postgreSQL, por serem mais seguros. Visando a manipulação das informações guardadas, a integração e a persistência no banco de dados, escolhemos como a nossa primeira ferramenta, o Hibernate que serve como intermediador entre a aplicação e o banco de dados, é importante ressaltar que essa ferramenta é uma implementação do modelo JPA.

A partir das considerações apresentadas acima, faremos um sistema de cadastro de usuários e endereços, onde cada usuário poderá cadastrar a si mesmo e também endereços para seu perfil. Abaixo temos a imagem de um projeto no esquema UMl para facilitar o entendimento de como ficam as entidades, User para usuários cadastrados e Address para endereços com seus atributos. Podemos analisar que existe uma relação entre as tabelas de um usuário para muitos endereços, essa relação será gerenciada pelo Hibernate.

 

Primeiramente começamos com a criação do projeto, usando o Editor Spring Boot Suite. E para testarmos o banco de dados, será utilizado o banco de dados virtual H2, disponibilizado pelo Hibernate, pois com ele podemos fazer os testes no próprio navegador com poucas configurações.

Com o projeto criado, vamos construir as classes, em java elas servem para estruturarmos o projeto em partes, para que possamos dar futuras manutenções com facilidade e desacoplamento. Funciona como se fosse um carro. Cada peça tem sua função e propriedades, se uma peça der defeito trocamos apenas ela. Aqui teremos as duas classes principais: usuários e endereços que serão representados pelas entidades User e Address.

Abaixo temos como exemplo o código da entidade User com suas propriedades e os métodos de leitura e escrita para cada campo.

 

 

Para auxilio no processo de comunicação com o banco de dados, usaremos o JPA, que nos ajuda na produção das classes que devemos criar. Nas classes, inserimos trechos de código chamados anotações. A primeira será a @Repository que configurará a comunicação com o banco de dados, com esta anotação o JPA identifica que esta classe é responsável pela tabela user. 

 

 

Com a comunicação feita, devemos dizer para o JPA que nossas tabelas serão User e Address, para isso usamos as anotações @Entity e @Table(name = “tb_user”) .

 

A próxima anotação será a @Service, que indica a classe de serviços que iremos criar. Ela é responsável por cuidar das regras de negócio da aplicação.

 

 

 

Agora temos a classe que controla as requisições das URIs, também conhecida como rotas. Nela usamos duas anotações a @RestController e a @RequestMapping, que indicam a classe e o caminho da rota respectivamente.

 

 

Com isso podemos rodar nossa aplicação localmente para vermos se as tabelas foram criadas. Usando o servidor virtual H2 do Hibernate, podemos abrir o navegador na rota: http://localhost:8080/h2-console

 

 

Podemos notar acima, que temos os nomes de nossas duas tabelas: tb_user e tb_address, criadas no esquerdo. Agora vamos criar um arquivo para salvar alguns dados nas tabelas. Este arquivo será para uso em testes. Ele ficará assim:

 

 

Em destaque, apresentamos as anotações @Configuration, @Profile(“test”). Também temos a @Autowired acima das declarações das classes userRepository e addressRepository, isso indica que o Hibernate fará o monitoramento com as nossas tabelas. Agora podemos rodar novamente o servidor e as tabelas estarão preenchidas como no arquivo de teste:

 

 

O banco de dados foi criado e está carregando os dados lançados, mas nós não queremos que as tabelas tenham dados criados automaticamente e sim que possamos inserir e pegar essas informações. Para isso criaremos três rotas no nosso arquivos de controle:

1-     rota que salva usuário com as propriedades que analisamos nas tabelas UML, não podendo ter campos vazios ou nulos. Também não pode ter usuário já cadastrado com o mesmo CPF ou E-mail;

2-     rota que recupera um usuário especifico com seus endereços cadastrados;

3-     rota que salva os endereços de um usuário, onde suas propriedades não podem ser nem nulas ou vazias.

 

A primeira rota que criaremos será a de salvar um usuário. Para que possamos saber se já existe um usuário no banco de dados por e-mail ou CPF, devemos criar estes métodos no UserRepository, já que ele se comunica com o banco de dados.

 

 

Já na classe UserService devemos criar um método que salva as informações que queremos, para isso, criaremos o método insert. Note que declaramos uma anotação @Autowired para que esta classe fique monitorada com o UserRepository, aqui também instanciamos dois usuários obj com aqueles métodos criados na classe UserRepository.

 

 

 

Depois de termos os dois objetos do banco, comparamos se ele são nulos, caso sim, usamos o metodo save que já vem protinho com o Hibernate e o usuario é salvo, se existe algum usuario com o CPF ou email no banco enviamos uma mensagem de erro.

Agora entramos numa questão muito importante, pois as mensagens de erros devem ser tratadas para que possam ser entendidas no retorno. Para isso criamos uma classe chamada ResourceExceptionHandler que monitorará as exceções lançadas pelo java. Abaixo temos a classe PropertyValueException, que retonará o status 400 e a mensagem de erro mostrando que o usuario já existe no banco de dados.

 

 

A classe ResourceExceptionHandler é responsavel pelo monitotamento das exceções lançadas pelo java, nela devemos colocar todas as nossas exceções criadas, podemos observar que o primeira erro é a PropertyValueException.

 

 

Tambem criamos as exceções para as rotas de busca de usuario e inserção de endereço.

Para rotas com metodos POST vamos usar a anotação @PostMapping do JPA na nossa classe UserController. Temos tambem a anotação @RequestBody indicando que os dados coletados serão repassados para a o usuario user. Validamos este usuario no metodo insert do service.

E como visto antes, se ele for nulo ele será salvo no banco de dados, retornando os dados do usuario. Com o retorno dos dados indicamos se o processo ocorreu certo ou emitimos um status diferente de 200.