API RESTful completa para o gerenciamento de um catálogo de produtos, construída com Java 21 e Spring Boot 4. Implementa todas as operações de CRUD via endpoints HTTP padronizados, com persistência em PostgreSQL, credenciais protegidas por variáveis de ambiente e documentação interativa via Swagger UI. Projeto estruturado em arquitetura em camadas, demonstrando separação clara de responsabilidades e boas práticas de engenharia de software.
| Tecnologia | Versão | Finalidade no Projeto |
|---|---|---|
| Java | 21 (Oracle OpenJDK) | Linguagem principal da aplicação |
| Spring Boot | 4.0.6 | Framework base: IoC, auto-configuração, servidor embutido |
| Spring Data JPA | (gerenciado pelo BOM) | Abstração do acesso a dados via repositórios |
| Hibernate | 7.2.12.Final | Implementação JPA; geração e execução de SQL |
| PostgreSQL | 18.3 | Banco de dados relacional para persistência |
| springdoc-openapi | 2.8.9 | Geração automática da documentação OpenAPI 3.1 + Swagger UI |
| Maven | 3.x | Gerenciamento de dependências e ciclo de build |
A documentação interativa é gerada automaticamente pelo springdoc-openapi e fica disponível após iniciar a aplicação:
| Interface | URL |
|---|---|
| Swagger UI | http://localhost:8080/swagger-ui/index.html |
| OpenAPI JSON | http://localhost:8080/v3/api-docs |
Pelo Swagger UI é possível visualizar todos os endpoints, seus parâmetros, schemas de request/response e executar chamadas diretamente no browser — sem precisar de Postman ou curl.
src/
└── main/
├── java/
│ └── com/claudio/crudapi/
│ ├── config/
│ │ └── OpenApiConfig.java ← Configuração do título e metadados da API
│ ├── controller/
│ │ └── ProdutoController.java ← Recebe requisições HTTP
│ ├── service/
│ │ └── ProdutoService.java ← Regras de negócio
│ ├── repository/
│ │ └── ProdutoRepository.java ← Acesso ao banco (Spring Data JPA)
│ └── model/
│ └── Produto.java ← Entidade JPA (id, nome, preco)
└── resources/
└── application.properties ← Configuração com ${DB_PASSWORD}
[Cliente HTTP / curl / Postman / Swagger UI]
│
▼ HTTP Request
[ ProdutoController ] ← Camada de entrada; mapeia rotas e serializa JSON
│
▼ Chama método de negócio
[ ProdutoService ] ← Valida regras; orquestra operações
│
▼ Consulta / Persiste
[ ProdutoRepository ] ← Interface JPA; gera SQL automaticamente
│
▼ JDBC / SQL
[ PostgreSQL ] ← Banco relacional; tabela 'produto'
│
▲ Resultado
(resposta percorre o caminho inverso até o cliente)
| Método | Endpoint | Descrição da Ação | Status HTTP de Sucesso |
|---|---|---|---|
GET |
/produtos |
Lista todos os produtos cadastrados | 200 OK |
GET |
/produtos/{id} |
Retorna um produto específico pelo ID | 200 OK |
POST |
/produtos |
Cadastra um novo produto | 201 Created |
PUT |
/produtos/{id} |
Atualiza os dados de um produto | 200 OK |
DELETE |
/produtos/{id} |
Remove um produto pelo ID | 204 No Content |
Request Body:
{
"nome": "Monitor LG UltraWide 29\"",
"preco": 1499.90
}Response Body 201 Created:
{
"id": 1,
"nome": "Monitor LG UltraWide 29\"",
"preco": 1499.90
}Request Body:
{
"nome": "Monitor LG UltraWide 29\" (Refurbished)",
"preco": 1199.90
}Response Body 200 OK:
{
"id": 1,
"nome": "Monitor LG UltraWide 29\" (Refurbished)",
"preco": 1199.90
}Response Body 200 OK:
[
{
"id": 1,
"nome": "Monitor LG UltraWide 29\" (Refurbished)",
"preco": 1199.90
},
{
"id": 2,
"nome": "Teclado Mecânico Keychron K2",
"preco": 459.00
},
{
"id": 3,
"nome": "SSD Kingston NV3 1TB M.2",
"preco": 329.90
}
]- Java 21 instalado e configurado no
PATH - PostgreSQL 18.3 em execução na porta
5432 - Maven 3.x (ou use o Maven Wrapper incluso no projeto — recomendado)
git clone https://github.com/claudiodeveloper-github/crudapi-springboot.git
cd crudapi-springbootConecte-se ao PostgreSQL (via psql, DBeaver ou pgAdmin) e execute:
CREATE DATABASE crudapi;O Hibernate irá criar a tabela
produtoautomaticamente ao iniciar a aplicação (DDL auto).
O arquivo application.properties não armazena a senha em texto puro. Ele lê a credencial via ${DB_PASSWORD}.
No IntelliJ IDEA:
-
Clique em "Edit Configurations..." (ao lado do botão ▶ Run).
-
Selecione a configuração da sua aplicação Spring Boot.
-
Localize o campo "Environment variables" e clique no ícone 📋.
-
Adicione a entrada: DB_PASSWORD=sua_senha_do_postgres
-
Clique em OK → Apply → OK e execute com ▶ Run.
No terminal (PowerShell):
$env:DB_PASSWORD="sua_senha_do_postgres"
./mvnw spring-boot:runNo terminal (Linux / macOS):
export DB_PASSWORD=sua_senha_do_postgres
./mvnw spring-boot:runSem essa configuração, o Spring Boot lançará
PSQLException: FATAL: password authentication failed.
Linux / macOS:
chmod +x mvnw
./mvnw spring-boot:runWindows:
mvnw.cmd spring-boot:runA API estará disponível em: http://localhost:8080
A documentação Swagger estará disponível em: http://localhost:8080/swagger-ui/index.html
curl -X GET http://localhost:8080/produtoscurl -X GET http://localhost:8080/produtos/1curl -X POST http://localhost:8080/produtos \
-H "Content-Type: application/json" \
-d "{\"nome\": \"Headset HyperX Cloud II\", \"preco\": 399.90}"Windows (Prompt de Comando):
curl -X POST http://localhost:8080/produtos -H "Content-Type: application/json" -d "{\"nome\": \"Headset HyperX Cloud II\", \"preco\": 399.90}"
curl -X PUT http://localhost:8080/produtos/1 \
-H "Content-Type: application/json" \
-d "{\"nome\": \"Headset HyperX Cloud II Wireless\", \"preco\": 549.90}"curl -X DELETE http://localhost:8080/produtos/1Resposta esperada:
204 No Content(sem body).
O application.properties utiliza interpolação de variável de ambiente para a senha do banco:
spring.datasource.password=${DB_PASSWORD}Isso garante que nenhuma credencial é exposta no código-fonte ou no histórico do Git. A senha existe apenas em tempo de execução, via configuração local da IDE ou variáveis do sistema operacional.
Cláudio G. S. Castro Java Backend Developer em Formação
Desenvolvedor Backend em formação com foco em Java e Spring Boot. Construindo APIs robustas com boas práticas, aprendendo continuamente e enfrentando desafios reais.
Este projeto está licenciado sob a licença MIT — veja o arquivo LICENSE para mais detalhes..
Feito com ☕ Java e muito aprendizado por Cláudio G. S. Castro
⭐ Se este projeto te ajudou ou te inspirou, deixa uma estrela no repositório!
