package org.resthub.jpa; import org.hibernate.ObjectNotFoundException; import org.resthub.common.model.RestError; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.context.request.WebRequest; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; import javax.persistence.EntityExistsException; import javax.persistence.EntityNotFoundException; /** * Spring MVC exception handler user to map JPA related exception to HTTP error codes. * Spring MVC is an optional dependency, it will be used only if already imported by your application. */ @ControllerAdvice public class JpaHandlerExceptionHandler extends ResponseEntityExceptionHandler { @ExceptionHandler(value={ ObjectNotFoundException.class, EntityNotFoundException.class, EntityExistsException.class, DataIntegrityViolationException.class }) public ResponseEntity<Object> handleCustomException(Exception ex, WebRequest request) { HttpHeaders headers = new HttpHeaders(); HttpStatus status; if (ex instanceof ObjectNotFoundException) { status = HttpStatus.NOT_FOUND; } else if (ex instanceof EntityNotFoundException) { status = HttpStatus.NOT_FOUND; } else if (ex instanceof EntityExistsException) { status = HttpStatus.CONFLICT; } else if (ex instanceof DataIntegrityViolationException) { status = HttpStatus.CONFLICT; } else { logger.warn("Unknown exception type: " + ex.getClass().getName()); status = HttpStatus.INTERNAL_SERVER_ERROR; return handleExceptionInternal(ex, null, headers, status, request); } return handleExceptionInternal(ex, buildRestError(ex, status), headers, status, request); } private RestError buildRestError(Exception ex, HttpStatus status) { RestError.Builder builder = new RestError.Builder(); builder.setCode(status.value()).setStatus(status.getReasonPhrase()).setThrowable(ex); return builder.build(); } }