API REST com Java e Spring Boot

API REST com Java e Spring Boot (Parte 3)


Um passo a passo para você aprender a fazer uma API REST com Java e Spring Boot do começo ao fim — Parte 3: Banco de dados e Tratamento de erros


Esta é a parte 3 da série API REST com Java e Spring Boot. Se você chegou direto aqui, comece pela parte 1.

Nesta Parte 3, veremos como ficou o nosso banco de dados após rodarmos o programa pela primeira vez e depois faremos uma simplificação do JSON que obtemos como resposta quando ocorre um erro.

API REST com Java e Spring Boot

MySQL

Como estamos utilizando o Hibernate, nossas tabelas e suas respectivas colunas são criadas automaticamente à execução da aplicação.

Como podemos ver, o Spring nos facilita as coisas a ponto de não termos que mexer diretamente com SQL. Com as anotações colocadas em nossas classes, temos o seguinte resultado:

Tabela “users” criada no banco de dados com suas colunas
Tabela “users” criada no banco de dados com suas colunas

Desse modo, nosso id é a chave primária e o CPF e o e-mail são chaves únicas. Se tentarmos cadastrar um usuário com um e-mail ou um CPF que já existe no sistema, ocorrerá um erro.

Simplificação do JSON

O próximo passo agora é simplificar o JSON enviado como resposta pelo Spring em caso de ocorrência de erros. Por padrão, é retornado a nós um JSON enorme e pouco legível. Para melhorar essa apresentação, devemos recorrer ao uso de um “interceptador”.

Fazemos isso criando uma classe isolada para tratar erros. Esse tratamento, por estar fora do controller no qual estamos trabalhando, dará conta de tratar os erros de todos os controllers presentes na aplicação.

Criamos então a classe ErrorHandler no pacote com.example.rest.config.validation.

Classe ErrorHandler
Classe ErrorHandler

A classe possui a anotação @RestControllerAdvice, que serve para podermos realizar o tratamento de erro no REST. O único método da classe é o handle, que recebe uma MethodArgumentNotValidException como parâmetro e retorna uma List<ErrorFormDto>.

Essa lista retornada é um ErrorFormDto, cuja função é representar o erro de formulário. Como qualquer DTO, a classe possui os atributos, o construtor inicializando esses atributos e a anotação @Data. A classe também fica no pacote de validation.

Os atributos que serão retornados pelo JSON quando houver uma exceção são apenas o campo no qual o erro ocorreu e a mensagem de erro.

Classe ErrorFormDto
Classe ErrorFormDto

Voltando ao método handle, para obtermos os erros que aconteceram na requisição, chamamos os métodos getBindingResult e getFieldErrors na exception que foi passada como parâmetro e atribuímos isso a uma variável de lista de erros.

Essa lista contém os erros que estamos procurando. Entretanto, como o método retorna uma lista de ErrorFormDto, devemos criar uma variável dto e iniciar uma ArrayList, na qual adicionaremos os erros encontrados. Percorrendo a lista de fieldErrors, para cada elemento encontrado criamos um objeto ErrorFormDto e o armazenamos em nossa ArrayList.

Dentro de um forEach, para criarmos um objeto ErrorFormDto, devemos fornecer os parâmetros field e errorMessage. Para o primeiro, é só usar o método getField. Para o segundo, precisamos criar uma String que recebe uma MessageSource que foi injetada na classe (@Autowired). Essa é uma classe do Spring que nos auxilia a obter mensagens de erro, inclusive dependentes do local, por meio do LocaleContextHolder.getLocale.

Além disso, para avisar ao Spring que o método será usado quando houver alguma exceção dentro de algum controller, usamos a anotação @ExceptionHandler, passando como parâmetro o tipo de exceção que ocorre em validação de formulários: MethodArgumentNotValidException.class.

Para garantir que seja devolvido o status 400 quando houver uma exceção, devemos utilizar a anotação @ResponseStatus, passando como parâmetro o código HttpStatus.BAD_REQUEST.

É assim que obtemos um JSON simplificado quando acontece uma exceção.

Em nossa API REST ainda precisamos implementar os métodos de atualização (PUT) e remoção (DELETE) de usuários e realizar os testes de requisição no Postman. Vamos, então, para a Parte 4.

Você pode ver o código completo no GitHub.


Está entrando no mundo da programação? Uma boa dica para iniciar seus estudos são os livros Lógica de Programação – JavaScript e HTML e Entendendo Algoritmos – guia ilustrado.

Está interessado em consumir uma API externa? Veja o artigo Consumindo API com Java, Spring Boot e Gradle.

Quer saber mais sobre APIs REST? Leia nosso artigo sobre as 9 melhores práticas!


Posts relacionados

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *