DISPONIBILIDAD
Validar que el vehículo exista y esté disponible antes de alquilar.
← PROYECTOSPROJECT_001 / CASO TÉCNICO
PLATAFORMA DE ALQUILER DE VEHÍCULOS
Aplicación web Java para gestionar vehículos, clientes y alquileres con arquitectura por capas, API REST, validación, polimorfismo, cálculo de precios y facturación.

01 / RETO
Validar que el vehículo exista y esté disponible antes de alquilar.
Modelar Coche, Moto, Furgoneta y CocheElectrico a partir de Vehiculo.
Cambiar disponibilidad y registrar el ciclo del alquiler.
Calcular importes y agrupar facturación por tipo de vehículo.
02 / ARQUITECTURA
Selecciona un nodo para revisar su responsabilidad.
03 / EVIDENCIA DEL PROYECTO
Clase abstracta Vehiculo con calcularPrecio(dias) y subtipos especializados.
POST de alquiler y PUT /{id}/devolucion.
Restricciones de matrícula, campos obligatorios y valores positivos.
GET /informes/facturacion agrupado por tipo de vehículo.
Java 21, Jersey 4, Jackson, Bean Validation, JSP/JSTL y Tomcat 11.
04 / IMPLEMENTACIÓN Y DECISIONES
Fragmentos seleccionados directamente de los archivos que componen el proyecto adjuntado.
public Alquiler alquilar(Long idCliente, Long idVehiculo, int dias) {
if (idCliente == null) {
throw new AlquilerException(Tipo.SOLICITUD_INVALIDA, "El id del cliente es obligatorio");
}
if (idVehiculo == null) {
throw new AlquilerException(Tipo.SOLICITUD_INVALIDA, "El id del vehículo es obligatorio");
}
Cliente cliente = daoCliente.obtenerPorId(idCliente).orElseThrow(
() -> new AlquilerException(Tipo.RECURSO_NO_ENCONTRADO, "No existe el cliente con id " + idCliente));
Vehiculo vehiculo = daoVehiculo.obtenerPorId(idVehiculo).orElseThrow(
() -> new AlquilerException(Tipo.RECURSO_NO_ENCONTRADO, "No existe el vehículo con id " + idVehiculo));
if (!vehiculo.isDisponible()) {
throw new AlquilerException(Tipo.VEHICULO_NO_DISPONIBLE,
"El vehículo con id " + idVehiculo + " no está disponible");
}
Alquiler alquiler = new Alquiler(null, cliente, vehiculo, LocalDate.now(), dias);
validador.validar(cliente);
validador.validar(vehiculo);
validador.validar(alquiler);
BigDecimal importe = vehiculo.calcularPrecio(dias);
alquiler.setImporte(importe);
vehiculo.setDisponible(false);
daoVehiculo.modificar(vehiculo);
return daoAlquiler.insertar(alquiler);Comprueba IDs, existencia y disponibilidad; valida entidades, calcula el importe, bloquea el vehículo y persiste el alquiler.
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response alquilar(@NotNull(message = "La solicitud es obligatoria") @Valid SolicitudAlquiler solicitud,
@Context UriInfo uriInfo) {
Alquiler alquiler = negocio.alquilar(solicitud.getIdCliente(), solicitud.getIdVehiculo(), solicitud.getDias());
URI location = uriInfo.getAbsolutePathBuilder().path(alquiler.getId().toString()).build();
return Response.created(location).entity(alquiler).build();La API recibe una solicitud validada, crea el alquiler y devuelve HTTP 201 con Location y la entidad creada.
PROJECT_001 / CIERRE
JAVA 21 × JERSEY 4 × REST × MAVEN