diff --git a/src/main/java/de/thm/arsnova/controller/ControllerExceptionHandler.java b/src/main/java/de/thm/arsnova/controller/ControllerExceptionHandler.java index bff2d2cc815722eb9cd35e0aea5a60886378529d..75ccfeadc293cb3e8c68b4afb10b6dedd4fe2779 100644 --- a/src/main/java/de/thm/arsnova/controller/ControllerExceptionHandler.java +++ b/src/main/java/de/thm/arsnova/controller/ControllerExceptionHandler.java @@ -26,8 +26,9 @@ import de.thm.arsnova.exceptions.PayloadTooLargeException; import de.thm.arsnova.exceptions.PreconditionFailedException; import de.thm.arsnova.exceptions.UnauthorizedException; import org.slf4j.event.Level; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; -import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.http.ResponseEntity; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException; @@ -37,6 +38,8 @@ import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.context.request.WebRequest; +import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -46,33 +49,39 @@ import java.util.Map; * Translates exceptions into HTTP status codes. */ @ControllerAdvice -public class ControllerExceptionHandler extends AbstractControllerExceptionHandler { +public class ControllerExceptionHandler extends ResponseEntityExceptionHandler { + private ControllerExceptionHelper helper; + + public ControllerExceptionHandler(final ControllerExceptionHelper helper) { + this.helper = helper; + } + @ExceptionHandler(NoContentException.class) @ResponseBody @ResponseStatus(HttpStatus.NO_CONTENT) public Map<String, Object> handleNoContentException(final Exception e, final HttpServletRequest request) { - return handleException(e, Level.TRACE); + return helper.handleException(e, Level.TRACE); } @ExceptionHandler(NotFoundException.class) @ResponseBody @ResponseStatus(HttpStatus.NOT_FOUND) public Map<String, Object> handleNotFoundException(final Exception e, final HttpServletRequest request) { - return handleException(e, Level.TRACE); + return helper.handleException(e, Level.TRACE); } @ExceptionHandler(UnauthorizedException.class) @ResponseBody @ResponseStatus(HttpStatus.UNAUTHORIZED) public Map<String, Object> handleUnauthorizedException(final Exception e, final HttpServletRequest request) { - return handleException(e, Level.TRACE); + return helper.handleException(e, Level.TRACE); } @ExceptionHandler(AuthenticationCredentialsNotFoundException.class) @ResponseStatus(HttpStatus.UNAUTHORIZED) @ResponseBody public Map<String, Object> handleAuthenticationCredentialsNotFoundException(final Exception e, final HttpServletRequest request) { - return handleException(e, Level.DEBUG); + return helper.handleException(e, Level.DEBUG); } @ExceptionHandler(AccessDeniedException.class) @@ -91,48 +100,47 @@ public class ControllerExceptionHandler extends AbstractControllerExceptionHandl response.setStatus(HttpStatus.FORBIDDEN.value()); } - return handleException(e, Level.DEBUG); + return helper.handleException(e, Level.DEBUG); } @ExceptionHandler(ForbiddenException.class) @ResponseBody @ResponseStatus(HttpStatus.FORBIDDEN) public Map<String, Object> handleForbiddenException(final Exception e, final HttpServletRequest request) { - return handleException(e, Level.DEBUG); + return helper.handleException(e, Level.DEBUG); } @ExceptionHandler(BadRequestException.class) @ResponseBody @ResponseStatus(HttpStatus.BAD_REQUEST) public Map<String, Object> handleBadRequestException(final Exception e, final HttpServletRequest request) { - return handleException(e, Level.DEBUG); + return helper.handleException(e, Level.DEBUG); } @ExceptionHandler(PreconditionFailedException.class) @ResponseBody @ResponseStatus(HttpStatus.PRECONDITION_FAILED) public Map<String, Object> handlePreconditionFailedException(final Exception e, final HttpServletRequest request) { - return handleException(e, Level.DEBUG); + return helper.handleException(e, Level.DEBUG); } @ExceptionHandler(NotImplementedException.class) @ResponseBody @ResponseStatus(HttpStatus.NOT_IMPLEMENTED) public Map<String, Object> handleNotImplementedException(final Exception e, final HttpServletRequest request) { - return handleException(e, Level.DEBUG); + return helper.handleException(e, Level.DEBUG); } @ExceptionHandler(PayloadTooLargeException.class) @ResponseBody @ResponseStatus(HttpStatus.PAYLOAD_TOO_LARGE) public Map<String, Object> handlePayloadTooLargeException(final Exception e, final HttpServletRequest request) { - return handleException(e, Level.DEBUG); + return helper.handleException(e, Level.DEBUG); } - @ExceptionHandler(HttpMessageNotReadableException.class) - @ResponseBody - @ResponseStatus(HttpStatus.BAD_REQUEST) - public Map<String, Object> handleHttpMessageNotReadableException(final Exception e, final HttpServletRequest request) { - return handleException(e, Level.DEBUG); + @Override + protected ResponseEntity<Object> handleExceptionInternal(final Exception ex, final Object body, + final HttpHeaders headers, final HttpStatus status, final WebRequest request) { + return new ResponseEntity<>(helper.handleException(ex, Level.TRACE), headers, status); } } diff --git a/src/main/java/de/thm/arsnova/controller/AbstractControllerExceptionHandler.java b/src/main/java/de/thm/arsnova/controller/ControllerExceptionHelper.java similarity index 86% rename from src/main/java/de/thm/arsnova/controller/AbstractControllerExceptionHandler.java rename to src/main/java/de/thm/arsnova/controller/ControllerExceptionHelper.java index 58e3f907e967d2f1eadc31592c4a87be04891237..50abc01c0effdf9308a0030c993fe198e14c6dff 100644 --- a/src/main/java/de/thm/arsnova/controller/AbstractControllerExceptionHandler.java +++ b/src/main/java/de/thm/arsnova/controller/ControllerExceptionHelper.java @@ -5,12 +5,14 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.event.Level; import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -public class AbstractControllerExceptionHandler { - private static final Logger logger = LoggerFactory.getLogger(AbstractControllerExceptionHandler.class); +@Component +public class ControllerExceptionHelper { + private static final Logger logger = LoggerFactory.getLogger(ControllerExceptionHelper.class); /* Since exception messages might contain sensitive data, they are not exposed by default. */ @Value("${api.expose-error-messages:false}") private boolean exposeMessages; diff --git a/src/main/java/de/thm/arsnova/controller/DefaultControllerExceptionHandler.java b/src/main/java/de/thm/arsnova/controller/DefaultControllerExceptionHandler.java index 3d124928001158db3c07765f8f4ad014bf677ef6..a788aa7912120a8f44fa35c3c3ab885ee6698169 100644 --- a/src/main/java/de/thm/arsnova/controller/DefaultControllerExceptionHandler.java +++ b/src/main/java/de/thm/arsnova/controller/DefaultControllerExceptionHandler.java @@ -12,7 +12,13 @@ import javax.servlet.http.HttpServletRequest; import java.util.Map; @ControllerAdvice -public class DefaultControllerExceptionHandler extends AbstractControllerExceptionHandler { +public class DefaultControllerExceptionHandler { + private ControllerExceptionHelper helper; + + public DefaultControllerExceptionHandler(final ControllerExceptionHelper helper) { + this.helper = helper; + } + @ExceptionHandler @ResponseBody @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @@ -27,6 +33,6 @@ public class DefaultControllerExceptionHandler extends AbstractControllerExcepti throw e; } - return handleException(e, Level.ERROR); + return helper.handleException(e, Level.ERROR); } }