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.
Desenvolvido por Cláudio · @claudiodeveloper-github