Skip to content

matbarroso97/springboot-client-crud

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CRUD de Clientes(Spring Boot)

Um sistema completo de gerenciamento de clientes desenvolvido em Spring Boot, implementando operações CRUD (Create, Read, Update, Delete) com arquitetura REST.

📋 Sobre o Projeto

Este projeto é uma API REST para gerenciamento de clientes, desenvolvida como parte de um desafio de programação. O sistema permite cadastrar, consultar, atualizar e excluir clientes através de endpoints RESTful.

🎯 Funcionalidades

  • CRUD Completo: Criar, ler, atualizar e deletar clientes
  • Paginação: Listagem de clientes com suporte a paginação
  • Validação: Validação de dados de entrada com mensagens personalizadas
  • Tratamento de Erros: Sistema robusto de tratamento de exceções
  • Banco H2: Banco de dados em memória para desenvolvimento/teste
  • Dados de Teste: 16 clientes pré-cadastrados para demonstração

🛠️ Tecnologias Utilizadas

  • Java 21
  • Spring Boot 3.5.5
  • Spring Data JPA
  • Spring Web
  • H2 Database (banco em memória)
  • Jakarta Validation
  • Hibernate Validator
  • Maven (gerenciamento de dependências)

📊 Estrutura do Projeto

src/
├── main/
│   ├── java/com/desafio/crud/
│   │   ├── controllers/          # Controladores REST
│   │   │   ├── ClientController.java
│   │   │   └── handlers/
│   │   │       └── ControllerExceptionHandler.java
│   │   ├── dto/                  # Data Transfer Objects
│   │   │   ├── ClientDTO.java
│   │   │   ├── CustomError.java
│   │   │   ├── FieldMessage.java
│   │   │   └── ValidationError.java
│   │   ├── entities/             # Entidades JPA
│   │   │   └── Client.java
│   │   ├── repositories/         # Repositórios de dados
│   │   │   └── ClientRepository.java
│   │   ├── services/             # Lógica de negócio
│   │   │   ├── ClientService.java
│   │   │   └── exceptions/
│   │   │       ├── DatabaseException.java
│   │   │       └── ResourceNotFoundException.java
│   │   └── CrudApplication.java  # Classe principal
│   └── resources/
│       ├── application.properties
│       ├── application-test.properties
│       └── import.sql            # Dados iniciais

🚀 Como Executar

Pré-requisitos

  • Java 21 ou superior
  • Maven 3.6 ou superior

Executando o Projeto

  1. Clone o repositório:

    git clone <url-do-repositorio>
    cd spring-boot-client-crud
  2. Execute a aplicação:

    ./mvnw spring-boot:run

    Ou no Windows:

    mvnw.cmd spring-boot:run
  3. Acesse a aplicação:

    • API Base URL: http://localhost:8080
    • Console H2: http://localhost:8080/h2-console

📚 Documentação da API

Endpoints Disponíveis

Método Endpoint Descrição
GET /clients Lista todos os clientes (com paginação)
GET /clients/{id} Busca cliente por ID
POST /clients Cria um novo cliente
PUT /clients/{id} Atualiza um cliente existente
DELETE /clients/{id} Remove um cliente

Exemplos de Uso

1. Listar todos os clientes (com paginação)

GET http://localhost:8080/clients?page=0&size=10&sort=name,asc

2. Buscar cliente por ID

GET http://localhost:8080/clients/1

3. Criar novo cliente

POST http://localhost:8080/clients
Content-Type: application/json

{
  "name": "João Silva",
  "cpf": "12345678901",
  "income": 5000.0,
  "birthDate": "1990-05-15",
  "children": 2
}

4. Atualizar cliente

PUT http://localhost:8080/clients/1
Content-Type: application/json

{
  "name": "João Silva Santos",
  "cpf": "12345678901",
  "income": 6000.0,
  "birthDate": "1990-05-15",
  "children": 3
}

5. Deletar cliente

DELETE http://localhost:8080/clients/1

Modelo de Dados - Cliente

{
  "id": 1,
  "name": "João Silva",
  "cpf": "12345678901",
  "income": 5000.0,
  "birthDate": "1990-05-15",
  "children": 2
}

Validações Implementadas

  • Nome: @NotEmpty - Obrigatório e não pode estar vazio
  • Data de Nascimento: @PastOrPresent - Não pode ser uma data futura

Nota: CPF, Renda e Número de Filhos são campos livres sem validação específica implementada.

🗄️ Banco de Dados

Configuração H2

  • URL: jdbc:h2:mem:testdb
  • Usuário: sa
  • Senha: (vazia)
  • Console: http://localhost:8080/h2-console

Dados Iniciais

O sistema já vem com 16 clientes pré-cadastrados para demonstração, incluindo dados como:

  • João Ferreira, CPF: 10830410215, Renda: R$ 5.000,00
  • Maria Oliveira, CPF: 32491877790, Renda: R$ 7.200,00
  • Ana Souza, CPF: 14726593401, Renda: R$ 3.200,00
  • E mais 13 clientes...

⚠️ Tratamento de Exceções Personalizadas

O sistema possui um tratamento robusto e personalizado de exceções com respostas padronizadas e estruturadas:

🏗️ Arquitetura de Exceções

  • ResourceNotFoundException: Cliente não encontrado (404)
  • DatabaseException: Erro de integridade referencial (400)
  • MethodArgumentNotValidException: Dados inválidos (422)

📋 Handler Global (@ControllerAdvice)

O ControllerExceptionHandler centraliza o tratamento de todas as exceções:

@ControllerAdvice
public class ControllerExceptionHandler {
    
    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<CustomError> resourceNotFound(...)
    
    @ExceptionHandler(DatabaseException.class)
    public ResponseEntity<CustomError> database(...)
    
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ValidationError> methodArgumentNotValid(...)
}

🎯 Códigos de Status HTTP

  • 200 OK: Operação realizada com sucesso
  • 201 Created: Cliente criado com sucesso
  • 204 No Content: Cliente deletado com sucesso
  • 400 Bad Request: Erro de integridade referencial
  • 404 Not Found: Cliente não encontrado
  • 422 Unprocessable Entity: Dados inválidos

📝 Estrutura das Respostas de Erro

Erro Simples (404/400)

{
  "timestamp": "2024-01-15T10:30:00Z",
  "status": 404,
  "error": "Recurso não encontrado",
  "path": "/clients/999"
}

Erro de Validação (422)

{
  "timestamp": "2024-01-15T10:30:00Z",
  "status": 422,
  "error": "Dados inválidos",
  "path": "/clients",
  "errors": [
    {
      "fieldName": "name",
      "message": "O nome é obrigatório e não pode estar vazio"
    },
    {
      "fieldName": "birthDate",
      "message": "A Data de nascimento não pode ser no futuro"
    }
  ]
}

🔧 DTOs de Erro Personalizados

  • CustomError: Estrutura base para erros simples
  • ValidationError: Herda de CustomError + lista de erros de campo
  • FieldMessage: Representa um erro específico de campo

Nota: Este é um projeto de demonstração usando banco H2 em memória. Os dados são perdidos quando a aplicação é reiniciada.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages