From dfa2ca4bffcfef5f9bca222319e97a6038920cb4 Mon Sep 17 00:00:00 2001
From: Daniel Gerhardt <code@dgerhardt.net>
Date: Tue, 25 Apr 2017 17:46:45 +0200
Subject: [PATCH] Fix exception handling

Exeption handling was broken by
56fe085e705f9c826cc2501f9c2859469c0a65c3 (GH-27).
---
 ...e.java => ControllerExceptionHandler.java} | 18 ++--------
 .../controller/DefaultExceptionHandler.java   | 36 +++++++++++++++++++
 2 files changed, 38 insertions(+), 16 deletions(-)
 rename src/main/java/de/thm/arsnova/controller/{SecurityExceptionControllerAdvice.java => ControllerExceptionHandler.java} (90%)
 create mode 100644 src/main/java/de/thm/arsnova/controller/DefaultExceptionHandler.java

diff --git a/src/main/java/de/thm/arsnova/controller/SecurityExceptionControllerAdvice.java b/src/main/java/de/thm/arsnova/controller/ControllerExceptionHandler.java
similarity index 90%
rename from src/main/java/de/thm/arsnova/controller/SecurityExceptionControllerAdvice.java
rename to src/main/java/de/thm/arsnova/controller/ControllerExceptionHandler.java
index 48111c53..6a8d22a4 100644
--- a/src/main/java/de/thm/arsnova/controller/SecurityExceptionControllerAdvice.java
+++ b/src/main/java/de/thm/arsnova/controller/ControllerExceptionHandler.java
@@ -41,24 +41,10 @@ import java.util.HashMap;
 import java.util.Map;
 
 /**
- * Translates security/authentication related exceptions into HTTP status codes.
+ * Translates exceptions into HTTP status codes.
  */
 @ControllerAdvice
-public class SecurityExceptionControllerAdvice {
-
-	@ExceptionHandler
-	@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
-	public Map<String, String> defaultExceptionHandler(
-			final Exception e,
-			final HttpServletRequest req
-			) {
-		final Map<String, String> result = new HashMap<>();
-		result.put("code", "500");
-		result.put("status", "Internal server error");
-		result.put("message", e.getMessage());
-		return result;
-	}
-
+public class ControllerExceptionHandler {
 	@ResponseStatus(HttpStatus.NOT_FOUND)
 	@ExceptionHandler(NotFoundException.class)
 	public void handleNotFoundException(final Exception e, final HttpServletRequest request) {
diff --git a/src/main/java/de/thm/arsnova/controller/DefaultExceptionHandler.java b/src/main/java/de/thm/arsnova/controller/DefaultExceptionHandler.java
new file mode 100644
index 00000000..ba76e18e
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/controller/DefaultExceptionHandler.java
@@ -0,0 +1,36 @@
+package de.thm.arsnova.controller;
+
+import org.springframework.core.annotation.AnnotationUtils;
+import org.springframework.http.HttpStatus;
+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 javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+
+@ControllerAdvice
+public class DefaultExceptionHandler {
+	@ExceptionHandler
+	@ResponseBody
+	@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
+	public Map<String, String> defaultExceptionHandler(
+			final Exception e,
+			final HttpServletRequest req
+	) throws Exception {
+		/* If the exception is annotated with @ResponseStatus rethrow it and let
+		 * the framework handle it.
+		 * See https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc. */
+		if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null) {
+			throw e;
+		}
+		final Map<String, String> result = new HashMap<>();
+		result.put("code", "500");
+		result.put("status", "Internal server error");
+		result.put("message", e.getMessage());
+
+		return result;
+	}
+}
-- 
GitLab