Package: org.jchilon3mas.springcloud.svc.envio.encomienda.excepciones Source: svc-envio-encomienda/src/main/java/org/jchilon3mas/springcloud/svc/envio/encomienda/excepciones/ClienteNotFoundException.java:3Description: Thrown when a requested customer cannot be found in the database.
Class Definition
package org.jchilon3mas.springcloud.svc.envio.encomienda.excepciones;public class ClienteNotFoundException extends RuntimeException { public ClienteNotFoundException(String message) { super(message); }}
public Cliente findClienteByDni(String dni) { return clienteRepository.findByDni(dni) .orElseThrow(() -> new ClienteNotFoundException( "Cliente con DNI " + dni + " no encontrado" ));}
Typically returns HTTP 404 (Not Found) when caught by exception handlers.
Package: org.jchilon3mas.springcloud.svc.envio.encomienda.excepciones Source: svc-envio-encomienda/src/main/java/org/jchilon3mas/springcloud/svc/envio/encomienda/excepciones/EnvioNotFoundException.java:3Description: Thrown when a requested shipment cannot be found in the database.
Class Definition
package org.jchilon3mas.springcloud.svc.envio.encomienda.excepciones;public class EnvioNotFoundException extends RuntimeException { public EnvioNotFoundException(String message) { super(message); }}
Package: org.jchilon3mas.springcloud.svc.envio.encomienda.excepciones Source: svc-envio-encomienda/src/main/java/org/jchilon3mas/springcloud/svc/envio/encomienda/excepciones/InvalidStateTransitionException.java:3Description: Thrown when attempting an invalid state transition for a shipment.
Class Definition
package org.jchilon3mas.springcloud.svc.envio.encomienda.excepciones;public class InvalidStateTransitionException extends RuntimeException { public InvalidStateTransitionException(String message) { super(message); }}
public void actualizarEstado(Long envioId, EstadoEnvio nuevoEstado) { Envio envio = findById(envioId); EstadoEnvio estadoActual = envio.getEstado(); // Validate state transition if (!isValidTransition(estadoActual, nuevoEstado)) { throw new InvalidStateTransitionException( String.format( "No se puede cambiar estado de %s a %s para el envío %s", estadoActual, nuevoEstado, envio.getCodigoSeguimiento() ) ); } envio.setEstado(nuevoEstado); envioRepository.save(envio);}private boolean isValidTransition(EstadoEnvio from, EstadoEnvio to) { // Terminal states cannot transition if (from == EstadoEnvio.ENTREGADO || from == EstadoEnvio.CANCELADO) { return false; } // Define valid transitions return switch (from) { case PENDIENTE -> to == EstadoEnvio.EN_TRANSITO || to == EstadoEnvio.CANCELADO; case EN_TRANSITO -> to == EstadoEnvio.DISPONIBLE || to == EstadoEnvio.CANCELADO; case DISPONIBLE -> to == EstadoEnvio.ENTREGADO || to == EstadoEnvio.CANCELADO; default -> false; };}
Typically returns HTTP 400 (Bad Request) or HTTP 409 (Conflict) when caught by exception handlers.
{ "timestamp": "2026-03-09T10:30:45", "status": 404, "error": "Not Found", "message": "Cliente con DNI 12345678 no encontrado", "path": "/api/clientes/dni/12345678"}
404 - Envio Not Found
{ "timestamp": "2026-03-09T10:32:15", "status": 404, "error": "Not Found", "message": "Envío con código ENV-1678901234567 no encontrado", "path": "/api/envios/codigo/ENV-1678901234567"}
400 - Invalid State Transition
{ "timestamp": "2026-03-09T10:35:20", "status": 400, "error": "Bad Request", "message": "No se puede cambiar estado de ENTREGADO a EN_TRANSITO para el envío ENV-1678901234567", "path": "/api/envios/123/estado"}
Consider using 409 Conflict instead of 400 for InvalidStateTransitionException to better represent the nature of the error as a business logic conflict.
Use InvalidStateTransitionException for business logic violations, not input validation errors. Use @Valid and MethodArgumentNotValidException for request validation.