Skip to content

abneribeiro/spring-boot

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Spring Boot API - Software Engineer Management

API REST para gerenciamento de engenheiros de software construĂ­da com Spring Boot 3.5.6 e Java 21.

🚀 Tecnologias

  • Java 21
  • Spring Boot 3.5.6
  • Spring Data JPA
  • PostgreSQL
  • Maven
  • Bean Validation

📋 Pré-requisitos

  • Java 21 ou superior
  • Maven 3.6+
  • PostgreSQL 12+

🔧 Configuração

Banco de Dados

Desenvolvimento (Profile: dev)

Database: springdb
Host: localhost
Port: 5332
Username: abneribeiro
Password: Admin123!

Produção (Profile: prod)

Configure as variáveis de ambiente:

export DATABASE_URL=jdbc:postgresql://localhost:5432/springdb
export DATABASE_USERNAME=seu_usuario
export DATABASE_PASSWORD=sua_senha

Executar a Aplicação

Modo Desenvolvimento:

mvn spring-boot:run

Modo Produção:

mvn spring-boot:run -Dspring-boot.run.profiles=prod

Build:

mvn clean package
java -jar target/spring-boot-0.0.1-SNAPSHOT.jar

📚 API Endpoints

Base URL: http://localhost:8080/api/v1/software-engineers

Listar Todos os Engenheiros

GET /api/v1/software-engineers

Resposta: 200 OK

[
  {
    "id": 1,
    "name": "John Doe",
    "techStack": "Java, Spring Boot, PostgreSQL"
  }
]

Buscar Engenheiro por ID

GET /api/v1/software-engineers/{id}

Resposta: 200 OK

{
  "id": 1,
  "name": "John Doe",
  "techStack": "Java, Spring Boot, PostgreSQL"
}

Erro: 404 Not Found

{
  "timestamp": "2025-10-09T00:00:00",
  "status": 404,
  "error": "Not Found",
  "message": "Software Engineer with id 1 not found",
  "path": "/api/v1/software-engineers/1"
}

Criar Novo Engenheiro

POST /api/v1/software-engineers
Content-Type: application/json

Body:

{
  "name": "John Doe",
  "techStack": "Java, Spring Boot, PostgreSQL"
}

Resposta: 201 Created

{
  "id": 1,
  "name": "John Doe",
  "techStack": "Java, Spring Boot, PostgreSQL"
}

Erro de Validação: 400 Bad Request

{
  "timestamp": "2025-10-09T00:00:00",
  "status": 400,
  "error": "Validation Failed",
  "message": "Invalid request body",
  "path": "/api/v1/software-engineers",
  "validationErrors": {
    "name": "Name is required",
    "techStack": "Tech stack must be between 2 and 200 characters"
  }
}

Atualizar Engenheiro

PUT /api/v1/software-engineers/{id}
Content-Type: application/json

Body:

{
  "name": "John Doe Updated",
  "techStack": "Java, Spring Boot, PostgreSQL, Docker"
}

Resposta: 200 OK

{
  "id": 1,
  "name": "John Doe Updated",
  "techStack": "Java, Spring Boot, PostgreSQL, Docker"
}

Deletar Engenheiro

DELETE /api/v1/software-engineers/{id}

Resposta: 204 No Content

🔒 Validações

SoftwareEngineerRequest

Campo Validação Mensagem de Erro
name ObrigatĂłrio "Name is required"
name 2-100 caracteres "Name must be between 2 and 100 characters"
techStack ObrigatĂłrio "Tech stack is required"
techStack 2-200 caracteres "Tech stack must be between 2 and 200 characters"

🏗️ Arquitetura

Estrutura de Pacotes

com.abneribeiro/
├── Application.java              # Classe principal
├── entity/                       # Entidades JPA
│   └── SoftwareEngineer.java
├── repository/                   # Repositórios JPA
│   └── SoftwareEngineerRepository.java
├── service/                      # Lógica de negócio
│   └── SoftwareEngineerService.java
├── controller/                   # Controllers REST
│   └── SoftwareEngineerController.java
├── dto/                         # Data Transfer Objects
│   ├── SoftwareEngineerRequest.java
│   └── SoftwareEngineerResponse.java
├── exception/                   # Tratamento de exceções
│   ├── ResourceNotFoundException.java
│   ├── ErrorResponse.java
│   └── GlobalExceptionHandler.java
└── config/                      # Configurações

Camadas

  1. Controller - Recebe requisições HTTP e valida dados
  2. Service - Contém lógica de negócio e conversão DTO ↔ Entity
  3. Repository - Acesso ao banco de dados via JPA
  4. Exception Handler - Tratamento global de exceções

🔍 Tratamento de Erros

A aplicação possui tratamento global de exceções com respostas padronizadas:

  • 404 Not Found - Recurso nĂŁo encontrado
  • 400 Bad Request - Validação falhou
  • 500 Internal Server Error - Erro interno do servidor

Todas as respostas de erro seguem o formato:

{
  "timestamp": "2025-10-09T00:00:00",
  "status": 404,
  "error": "Not Found",
  "message": "Mensagem descritiva do erro",
  "path": "/caminho/requisicao",
  "validationErrors": {
    "campo": "mensagem de erro"
  }
}

📊 Modelo de Dados

SoftwareEngineer (Entidade)

Campo Tipo Descrição
id Integer ID auto-incrementado (PK)
name String Nome do engenheiro
techStack String Tecnologias que domina

đź§Ş Testes

mvn test

📝 Configuração de Profiles

application.properties (Principal)

spring.application.name=spring-boot
spring.profiles.active=dev

application-dev.properties (Desenvolvimento)

spring.datasource.url=jdbc:postgresql://localhost:5332/springdb
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true

application-prod.properties (Produção)

spring.datasource.url=${DATABASE_URL}
spring.datasource.username=${DATABASE_USERNAME}
spring.datasource.password=${DATABASE_PASSWORD}
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.show-sql=false

🛡️ Boas Práticas Implementadas

  • âś… Separação de responsabilidades (Controller, Service, Repository)
  • âś… DTOs para separar camada de API da camada de dados
  • âś… Validação de entrada com Bean Validation
  • âś… Tratamento global de exceções
  • âś… Status HTTP apropriados (200, 201, 204, 400, 404)
  • âś… Injeção de dependĂŞncias via construtor
  • âś… Profiles de configuração (dev/prod)
  • âś… Externalização de credenciais sensĂ­veis
  • âś… Respostas de erro padronizadas

📦 Dependências Principais

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
    </dependency>
</dependencies>

🤝 Contribuindo

  1. Fork o projeto
  2. Crie uma branch para sua feature (git checkout -b feature/AmazingFeature)
  3. Commit suas mudanças (git commit -m "Add some AmazingFeature")
  4. Push para a branch (git push origin feature/AmazingFeature)
  5. Abra um Pull Request

📄 Licença

Este projeto está sob a licença MIT.

👤 Autor

Abner Ribeiro

About

Java 21 and Spring Boot 3.5.6 REST API for engineer management."

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages