Skip to main content

Exceptions

En este apartado se detallan varios aspectos a tener en cuenta sobre el uso de excepciones en el proyecto.

Excepciones y transaccionalidad

En aquellos métodos de servicios del proyecto que sean transaccionales (es decir, aquellos que lleven asociada la anotación @Transactional) y que puedan lanzar excepciones, deberán añadirse todas las excepciones lanzadas:

  • A la signatura del método, empleando la palabra clave throws.
  • A la anotación @Transactional, mediante la propiedad rollbackFor.

Así, si tenemos un método que puede lanzar una ResourceNotFoundException, debería:

@Transactional(readonly = true)
public void foo(Integer a) {
if (a > 0) {
throw new ResourceNotFoundException("Resource not found");
}
}

Deberá añadirse dicha excepción de la siguiente manera:

@Transactional(readonly = true, rollbackFor = ResourceNotFoundException.class)
public void foo(Integer a) throws ResourceNotFoundException {
if (a > 0) {
throw new ResourceNotFoundException("Resource not found");
}
}

Si además añadimos la posibilidad de que el método lance una InvalidRequestException...

@Transactional(readonly = true, rollbackFor = ResourceNotFoundException.class)
public void foo(Integer a) throws ResourceNotFoundException {
if (a > 0) {
throw new ResourceNotFoundException("Resource not found");
} else {
throw new InvalidRequestException("Invalid request");
}
}

...dicha excepción deberá añadirse también:

@Transactional(readonly = true, rollbackFor = {ResourceNotFoundException.class, InvalidRequestException.class})
public void foo(Integer a) throws ResourceNotFoundException, InvalidRequestException {
if (a > 0) {
throw new ResourceNotFoundException("Resource not found");
} else {
throw new InvalidRequestException("Invalid request");
}
}