WIP: Implemented CustomErrorHandler, that can resolve exceptions during rendering
[maven-thymeleaf-skin] / src / main / java / de / juplo / thymeproxy / Application.java
index 0840e95..4c1cd50 100644 (file)
@@ -2,9 +2,11 @@ package de.juplo.thymeproxy;
 
 import de.juplo.thymeleaf.JuploDialect;
 import java.util.HashMap;
+import java.util.Locale;
 import java.util.Map;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import org.apache.http.HttpStatus;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.SpringApplication;
@@ -19,11 +21,14 @@ import org.springframework.core.Ordered;
 import org.springframework.core.env.Environment;
 import org.springframework.http.MediaType;
 import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.View;
 import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
 import org.springframework.web.servlet.mvc.UrlFilenameViewController;
+import org.thymeleaf.exceptions.TemplateInputException;
 import org.thymeleaf.resourceresolver.IResourceResolver;
 import org.thymeleaf.resourceresolver.UrlResourceResolver;
+import org.thymeleaf.spring4.view.ThymeleafViewResolver;
 import org.thymeleaf.templateresolver.TemplateResolver;
 
 
@@ -116,6 +121,12 @@ public class Application extends WebMvcConfigurerAdapter
     return new JuploDialect();
   }
 
+  @Bean
+  public View error(ThymeleafViewResolver resolver) throws Exception
+  {
+    return resolver.resolveViewName("templates/500", Locale.getDefault());
+  }
+
   @Bean
   public ErrorController errorController(ErrorAttributes errorAttributes)
   {
@@ -138,6 +149,10 @@ public class Application extends WebMvcConfigurerAdapter
 
   static class CustomErrorController extends BasicErrorController
   {
+    public final static String TEMPLATE_INPUT_EXCEPTION =
+        TemplateInputException.class.getCanonicalName();
+
+
     CustomErrorController(
         ErrorAttributes errorAttributes,
         ErrorProperties errorProperties
@@ -148,15 +163,33 @@ public class Application extends WebMvcConfigurerAdapter
 
 
     @Override
-    public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response)
+    public ModelAndView errorHtml(
+        HttpServletRequest request,
+        HttpServletResponse response
+        )
     {
-      response.setStatus(getStatus(request).value());
       Map<String, Object> model =
           getErrorAttributes(
               request,
               isIncludeStackTrace(request, MediaType.TEXT_HTML)
               );
-      return new ModelAndView("templates/error", model);
+
+      String view;
+
+      switch ((String)model.get("exception"))
+      {
+        case "org.thymeleaf.exceptions.TemplateInputException":
+          response.setStatus(HttpStatus.SC_NOT_FOUND);
+          view = "templates/404";
+          break;
+
+        default:
+          response.setStatus(getStatus(request).value());
+          view = "templates/500";
+          break;
+      }
+
+      return new ModelAndView(view, model);
     }
   }
 }
\ No newline at end of file