Sistema completo de gestión de proyectos de desarrollo de software con Spring Boot, JPA, MySQL y Docker.
- ✅ 3 Entidades JPA con relaciones (Desarrollador, Proyecto, Tarea)
- ✅ DTOs para separación de capas
- ✅ Validaciones completas con Bean Validation
- ✅ Manejo de excepciones personalizado
- ✅ Repositorios JPA con métodos personalizados
- ✅ Servicios con lógica de negocio
- ✅ Controladores REST CRUD completo
- ✅ Tests unitarios con Mockito (24 tests)
- ✅ Tests de integración con MockMvc (18 tests)
- ✅ Docker Compose para MySQL
- JDK 17 o superior
- Maven 3.8+
- Docker Desktop instalado y en ejecución
- IntelliJ IDEA o cualquier IDE compatible con Spring Boot
- Postman (opcional, para pruebas de API)
git clone <url-del-repositorio>
cd practicodocker-compose up -dEsto levantará MySQL en el puerto 3306 con:
- Base de datos:
proyectosdb - Usuario:
spring - Contraseña:
spring
docker ps
docker-compose logs mysqlmvn clean compilemvn testDeberías ver todos los tests pasando (42 tests en total).
mvn spring-boot:runLa aplicación estará disponible en: http://localhost:8080
GET /api/desarrolladores - Obtener todos los desarrolladores
GET /api/desarrolladores/{id} - Obtener desarrollador por ID
GET /api/desarrolladores/activos - Obtener desarrolladores activos
GET /api/desarrolladores/especialidad/{especialidad} - Filtrar por especialidad
POST /api/desarrolladores - Crear nuevo desarrollador
PUT /api/desarrolladores/{id} - Actualizar desarrollador
DELETE /api/desarrolladores/{id} - Eliminar desarrollador
GET /api/proyectos - Obtener todos los proyectos
GET /api/proyectos/{id} - Obtener proyecto por ID
GET /api/proyectos/activos - Obtener proyectos activos
GET /api/proyectos/estado/{estado} - Filtrar por estado
GET /api/proyectos/lider/{desarrolladorId} - Filtrar por líder
POST /api/proyectos - Crear nuevo proyecto
PUT /api/proyectos/{id} - Actualizar proyecto
DELETE /api/proyectos/{id} - Eliminar proyecto
GET /api/tareas - Obtener todas las tareas
GET /api/tareas/{id} - Obtener tarea por ID
GET /api/tareas/proyecto/{proyectoId} - Filtrar por proyecto
GET /api/tareas/desarrollador/{desarrolladorId} - Filtrar por desarrollador
GET /api/tareas/estado/{estado} - Filtrar por estado
POST /api/tareas - Crear nueva tarea
PUT /api/tareas/{id} - Actualizar tarea
DELETE /api/tareas/{id} - Eliminar tarea
curl -X POST http://localhost:8080/api/desarrolladores \
-H "Content-Type: application/json" \
-d '{
"nombre": "Carlos",
"apellido": "Martínez",
"email": "carlos.martinez@devteam.com",
"especialidad": "Backend",
"nivelExperiencia": "SENIOR",
"salarioMensual": 3500.00,
"fechaContratacion": "2023-01-15"
}'curl -X POST http://localhost:8080/api/proyectos \
-H "Content-Type: application/json" \
-d '{
"nombre": "Sistema de Gestión Hospitalaria",
"codigo": "PRJ-2025-001",
"descripcion": "API REST para gestión de pacientes y citas médicas",
"cliente": "Hospital Central",
"presupuesto": 50000.00,
"fechaInicio": "2025-01-10",
"fechaFinEstimada": "2025-06-30",
"desarrolladorLiderId": 1,
"tecnologias": "Java,Spring Boot,MySQL,Docker,React"
}'curl -X POST http://localhost:8080/api/tareas \
-H "Content-Type: application/json" \
-d '{
"proyectoId": 1,
"desarrolladorAsignadoId": 2,
"titulo": "Implementar módulo de autenticación JWT",
"descripcion": "Crear endpoints de login, registro y refresh token",
"prioridad": "ALTA",
"horasEstimadas": 16,
"fechaLimite": "2025-01-25"
}'curl http://localhost:8080/api/desarrolladoresEl proyecto incluye:
- 24 tests unitarios de servicios con Mockito
- 18 tests de integración con MockMvc
Para ejecutar solo tests unitarios:
mvn test -Dtest=*ServiceTestPara ejecutar solo tests de integración:
mvn test -Dtest=*IntegrationTestsrc/
├── main/
│ ├── java/es/iesguzman/proyectos/
│ │ ├── ProyectosApplication.java
│ │ ├── controller/ # Controladores REST
│ │ │ ├── DesarrolladorController.java
│ │ │ ├── ProyectoController.java
│ │ │ └── TareaController.java
│ │ ├── service/ # Lógica de negocio
│ │ │ ├── DesarrolladorService.java
│ │ │ ├── ProyectoService.java
│ │ │ └── TareaService.java
│ │ ├── repository/ # Acceso a datos
│ │ │ ├── DesarrolladorRepository.java
│ │ │ ├── ProyectoRepository.java
│ │ │ └── TareaRepository.java
│ │ ├── model/ # Entidades JPA
│ │ │ ├── Desarrollador.java
│ │ │ ├── Proyecto.java
│ │ │ └── Tarea.java
│ │ ├── dto/ # Data Transfer Objects
│ │ │ ├── DesarrolladorDTO.java
│ │ │ ├── DesarrolladorCreateUpdateDTO.java
│ │ │ ├── ProyectoDTO.java
│ │ │ ├── ProyectoCreateUpdateDTO.java
│ │ │ ├── TareaDTO.java
│ │ │ ├── TareaCreateDTO.java
│ │ │ └── TareaUpdateDTO.java
│ │ └── exception/ # Manejo de excepciones
│ │ ├── ResourceNotFoundException.java
│ │ ├── ValidationException.java
│ │ ├── ConflictException.java
│ │ └── GlobalExceptionHandler.java
│ └── resources/
│ └── application.properties
└── test/
└── java/es/iesguzman/proyectos/
├── service/ # Tests unitarios
│ ├── DesarrolladorServiceTest.java
│ ├── ProyectoServiceTest.java
│ └── TareaServiceTest.java
└── controller/ # Tests de integración
├── DesarrolladorControllerIntegrationTest.java
├── ProyectoControllerIntegrationTest.java
└── TareaControllerIntegrationTest.java
- Java 17
- Spring Boot 3.2.0
- Spring Data JPA
- MySQL 8.0
- Lombok
- Bean Validation
- JUnit 5
- Mockito
- MockMvc
- Docker & Docker Compose
- Maven
# Levantar servicios
docker-compose up -d
# Detener servicios
docker-compose down
# Ver logs
docker-compose logs -f mysql
# Reiniciar servicios
docker-compose restart
# Eliminar todo (incluyendo volúmenes)
docker-compose down -v
# Conectarse a MySQL
docker exec -it proyectos-mysql mysql -u spring -p- Nombre y apellido: 3-50 caracteres
- Email único y formato válido
- Salario entre 800 y 15,000
- Fecha de contratación no posterior a hoy
- Solo activos pueden liderar proyectos
- Nombre: 5-100 caracteres, único
- Código: formato PRJ-YYYY-XXX, único
- Presupuesto: entre 1,000 y 500,000
- Fecha fin posterior a fecha inicio
- Líder debe ser SENIOR o LEAD
- Título: 10-200 caracteres
- Horas estimadas: 1-200
- Fecha límite posterior a hoy
- Solo en proyectos EN_DESARROLLO o EN_PRUEBAS
- Desarrollador debe estar activo
La API devuelve respuestas estructuradas para todos los errores:
{
"timestamp": "2025-11-22T10:30:00",
"status": 404,
"error": "Not Found",
"message": "Desarrollador con id 99 no encontrado",
"path": "/api/desarrolladores/99"
}Códigos de estado HTTP:
200 OK- Operación exitosa201 Created- Recurso creado204 No Content- Eliminación exitosa400 Bad Request- Error de validación404 Not Found- Recurso no encontrado409 Conflict- Conflicto de negocio
- Ver archivo
EXAMEN_PRACTICO_2DAW.mdpara especificaciones completas - Colección de Postman disponible en
postman/
Examen Práctico 2DAW - Desarrollo Web en Servidor
IES Guzmán El Bueno
Este proyecto es material educativo para el examen de 2DAW.