API REST para gerenciamento de engenheiros de software construĂda com Spring Boot 3.5.6 e Java 21.
- Java 21
- Spring Boot 3.5.6
- Spring Data JPA
- PostgreSQL
- Maven
- Bean Validation
- Java 21 ou superior
- Maven 3.6+
- PostgreSQL 12+
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_senhaModo Desenvolvimento:
mvn spring-boot:runModo Produção:
mvn spring-boot:run -Dspring-boot.run.profiles=prodBuild:
mvn clean package
java -jar target/spring-boot-0.0.1-SNAPSHOT.jarBase URL: http://localhost:8080/api/v1/software-engineers
GET /api/v1/software-engineersResposta: 200 OK
[
{
"id": 1,
"name": "John Doe",
"techStack": "Java, Spring Boot, PostgreSQL"
}
]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"
}POST /api/v1/software-engineers
Content-Type: application/jsonBody:
{
"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"
}
}PUT /api/v1/software-engineers/{id}
Content-Type: application/jsonBody:
{
"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"
}DELETE /api/v1/software-engineers/{id}Resposta: 204 No Content
| 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" |
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
- Controller - Recebe requisições HTTP e valida dados
- Service - Contém lógica de negócio e conversão DTO ↔ Entity
- Repository - Acesso ao banco de dados via JPA
- Exception Handler - Tratamento global de exceções
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"
}
}| Campo | Tipo | Descrição |
|---|---|---|
| id | Integer | ID auto-incrementado (PK) |
| name | String | Nome do engenheiro |
| techStack | String | Tecnologias que domina |
mvn testspring.application.name=spring-boot
spring.profiles.active=devspring.datasource.url=jdbc:postgresql://localhost:5332/springdb
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=truespring.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- ✅ 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
<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>- Fork o projeto
- Crie uma branch para sua feature (
git checkout -b feature/AmazingFeature) - Commit suas mudanças (
git commit -m "Add some AmazingFeature") - Push para a branch (
git push origin feature/AmazingFeature) - Abra um Pull Request
Este projeto está sob a licença MIT.
Abner Ribeiro