API REST desenvolvida com Spring Framework (sem Spring Boot), utilizando configuração XML e arquitetura multi-módulo Maven.
raw-spring-app/
├── pom.xml # POM parent
├── deploy.sh # Script de deploy automatizado
├── start-tomcat-dev.sh # Script para iniciar Tomcat (dev)
├── start-tomcat-prod.sh # Script para iniciar Tomcat (prod)
├── docker-compose.yaml # Configuração Docker Compose
├── Dockerfile # Multi-stage build Docker
├── mysql/ # Scripts SQL para inicialização
│ ├── 01_schema.sql
│ ├── 02_CreateRoom.sql
│ └── ...
├── configuration/ # Módulo de configuração
│ ├── pom.xml
│ └── src/main/
│ ├── java/
│ │ └── dev/spring/config/
│ │ └── EnvInitializer.java
│ └── resources/
│ ├── application.properties
│ └── spring/
│ ├── applicationContext.xml
│ ├── database-dev.xml
│ └── database-prod.xml
└── application/ # Módulo web (WAR)
├── pom.xml
└── src/main/
├── java/
│ └── dev/spring/
│ ├── config/
│ ├── controller/
│ ├── mapper/
│ ├── model/
│ ├── repository/
│ └── service/
└── webapp/
└── WEB-INF/
├── web.xml
└── dispatcher-servlet.xml
O projeto possui 2 profiles configurados:
- Banco de dados: MySQL (base de desenvolvimento)
- URL: jdbc:mysql://localhost:3306/app_db
- Usuário: app_user
- Senha: app_pass
- Banco de dados: MySQL (base de produção)
- URL: jdbc:mysql://localhost:3306/app_db
- Usuário: app_user
- Senha: app_pass
As propriedades podem ser sobrescritas via variáveis de ambiente:
export SPRING_PROFILES_ACTIVE=prod
export DB_URL=jdbc:mysql://servidor:3306/banco
export DB_USERNAME=usuario
export DB_PASSWORD=senhamvn clean packagemvn clean package -Pprodmvn clean package -Dspring.profiles.active=prod -Ddb.url=jdbc:mysql://... -Ddb.username=user -Ddb.password=passO arquivo WAR gerado estará em:
application/target/raw-spring-app-application.war
Use o script de deploy fornecido:
# Deploy com profile dev (padrão)
./deploy.sh
# Deploy com profile prod
./deploy.sh prod- Copiar o WAR para o diretório webapps do Tomcat:
cp application/target/raw-spring-app-application.war $TOMCAT_HOME/webapps/- (Opcional) Definir variáveis de ambiente no Tomcat:
Editar $TOMCAT_HOME/bin/setenv.sh:
export SPRING_PROFILES_ACTIVE=prod
export DB_URL=jdbc:mysql://localhost:3306/app_db
export DB_USERNAME=app_user
export DB_PASSWORD=app_pass- Iniciar o Tomcat:
$TOMCAT_HOME/bin/startup.shO projeto inclui scripts para inicializar o Tomcat com o profile correto:
# Iniciar com profile dev
./start-tomcat-dev.sh
# Iniciar com profile prod
./start-tomcat-prod.shO projeto inclui suporte para execução via Docker Compose com Multi-stage Build, que compila o projeto e sobe o banco de dados MySQL e a aplicação Tomcat automaticamente.
- Docker e Docker Compose instalados
-
Inicie os containers (o build do WAR será feito automaticamente dentro do container):
docker-compose up -d --build
-
A aplicação estará disponível em:
http://localhost:8080/room_api/api/rooms
docker-compose downA Base URL depende do método de deploy:
- Local (Tomcat/Maven):
http://localhost:8080/raw-spring-app-application - Docker:
http://localhost:8080/room_api
(Os exemplos abaixo utilizam a URL Local)
Endpoints que utilizam implementação com queries SQL diretas via JDBC.
- GET
/api/rooms- Listar todos os quartos - GET
/api/rooms/{id}- Obter quarto por ID - POST
/api/rooms- Criar novo quarto - PUT
/api/rooms/{id}- Atualizar quarto - DELETE
/api/rooms/{id}- Deletar quarto
curl -X POST http://localhost:8080/raw-spring-app-application/api/rooms \
-H "Content-Type: application/json" \
-d '{
"number": "101",
"type": "SINGLE",
"capacity": 1,
"pricePerNight": 100.00,
"status": "AVAILABLE"
}'Endpoints que utilizam implementação baseada em Stored Procedures no banco de dados.
- GET
/api/rooms/stored-procedure- Listar todos os quartos - GET
/api/rooms/stored-procedure/{id}- Obter quarto por ID - POST
/api/rooms/stored-procedure- Criar novo quarto - PUT
/api/rooms/stored-procedure/{id}- Atualizar quarto - DELETE
/api/rooms/stored-procedure/{id}- Deletar quarto
curl -X POST http://localhost:8080/raw-spring-app-application/api/rooms/stored-procedure \
-H "Content-Type: application/json" \
-d '{
"number": "202",
"type": "DOUBLE",
"capacity": 2,
"pricePerNight": 150.00,
"status": "AVAILABLE"
}'- Spring Framework 7.0.3
- Spring MVC
- Spring JDBC
- Jackson 2.15.2 (JSON)
- MySQL Connector 9.3.0
- Jakarta Servlet API 6.0
- Maven 3.x
O projeto utiliza configuração XML pura (sem anotações de configuração):
- web.xml: Configuração do servlet container
- applicationContext.xml: Contexto raiz (Services, Repositories, DataSource)
- dispatcher-servlet.xml: Contexto web (Controllers)
- database-{profile}.xml: Configuração específica por profile
O Maven realiza resource filtering no arquivo application.properties, substituindo placeholders ${...} pelos valores definidos nos profiles ou variáveis de ambiente.
- Certifique-se de que o profile está ativo
- Verifique se as variáveis de ambiente estão definidas
- Use
-Pdevou-Pprodno build Maven
- Verifique o context path da aplicação
- URL Local:
http://localhost:8080/raw-spring-app-application/api/rooms - URL Docker:
http://localhost:8080/room_api/api/rooms
- Certifique-se de que o MySQL está rodando e acessível
- Verifique se os bancos app_db (prod) e app_db_dev (dev) existem
- Verifique credenciais em
application.propertiesou variáveis de ambiente
- Implementar autenticação e autorização (Spring Security)
- Adicionar testes unitários e de integração
- Configurar CI/CD para deploy automático
- Implementar cache para melhorar performance
- Adicionar container com a documentação da API (Apidog)
- Refatorar código para melhor organização e manutenção
- Implementar logging e monitoramento (Log4j)