Browse Source

servlet3-cass: include jstl runtime in WAR; improve error handling

marko asplund 11 years ago
parent
commit
bb969895a6

+ 7 - 1
servlet3-cass/pom.xml

@@ -12,7 +12,6 @@
 
         <slf4j.version>1.7.7</slf4j.version>
         <logback.version>1.1.2</logback.version>
-        <jersey.version>2.10</jersey.version>
     </properties>
 
     <build>
@@ -53,6 +52,13 @@
             <scope>provided</scope>
         </dependency>
 
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>jstl</artifactId>
+            <version>1.2</version>
+            <scope>runtime</scope>
+        </dependency>
+
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-databind</artifactId>

+ 9 - 5
servlet3-cass/src/main/java/fi/markoa/tfb/servlet3/DatabaseBaseServlet.java

@@ -9,6 +9,7 @@ import javax.servlet.AsyncContext;
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
@@ -53,21 +54,24 @@ public abstract class DatabaseBaseServlet extends HttpServlet {
           mapper.writeValue(asyncContext.getResponse().getOutputStream(), world);
         } catch (IOException ex) {
           LOGGER.error("failed to get output stream", ex);
-          throw new RuntimeException("failed to get output stream", ex);
         }
         asyncContext.complete();
       }
 
       @Override
       public void onFailure(Throwable th) {
-        // TODO
-        LOGGER.error("failed to get data, "+th);
-        asyncContext.complete();
-        throw new RuntimeException(th);
+        LOGGER.error("failed to read data", th);
+        errorDispatch(asyncContext, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "failed to read data: "+th.getMessage());
       }
     }, executor);
   }
 
+  protected void errorDispatch(AsyncContext asyncContext, int statusCode, String message) {
+    asyncContext.getRequest().setAttribute("statusCode", statusCode);
+    asyncContext.getRequest().setAttribute("message", message);
+    asyncContext.dispatch("/jsp/error.jsp");
+  }
+
   protected int getQueries(String queries) {
     int q;
     if(queries == null) {

+ 3 - 2
servlet3-cass/src/main/java/fi/markoa/tfb/servlet3/DatabaseUpdatesServlet.java

@@ -47,7 +47,8 @@ public class DatabaseUpdatesServlet extends DatabaseBaseServlet {
           newRandoms = newRandomsFuture.get();
         } catch (InterruptedException | ExecutionException ex) {
           LOGGER.error("failed to generate random numbers", ex);
-          throw new RuntimeException("failed to generate random numbers", ex);
+          errorDispatch(asyncContext, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "failed to generate random numbers"+ex.getMessage());
+          return;
         }
         List<World> newWorlds = new ArrayList<>();
         for(int i = 0; i < worlds.size(); i++)
@@ -58,7 +59,6 @@ public class DatabaseUpdatesServlet extends DatabaseBaseServlet {
           mapper.writeValue(asyncContext.getResponse().getOutputStream(), newWorlds);
         } catch (IOException ex) {
           LOGGER.error("failed to get output stream", ex);
-          throw new RuntimeException("failed to get output stream", ex);
         }
         asyncContext.complete();
 
@@ -68,6 +68,7 @@ public class DatabaseUpdatesServlet extends DatabaseBaseServlet {
       @Override
       public void onFailure(Throwable th) {
         LOGGER.error("update failed", th);
+        errorDispatch(asyncContext, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "update failed: "+th.getMessage());
       }
     }, executorService);
 

+ 17 - 0
servlet3-cass/src/main/webapp/jsp/error.jsp

@@ -0,0 +1,17 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ page session="false" %>
+<%
+    if(request.getAttribute("statusCode") != null)
+        response.setStatus((Integer)request.getAttribute("statusCode"));
+    else
+        response.setStatus(500);
+%>
+<html>
+<head>
+<title>error</title>
+</head>
+<body>
+<h1>error</h1>
+${message}
+</body>
+</html>