diff --git a/example-webapp.ipr b/example-webapp.ipr
index 1838dc0..b0375d9 100644
--- a/example-webapp.ipr
+++ b/example-webapp.ipr
@@ -351,6 +351,7 @@
+
diff --git a/src/main/example/ftl/HtmlExceptionHandler.java b/src/main/example/ftl/HtmlExceptionHandler.java
new file mode 100644
index 0000000..cd27047
--- /dev/null
+++ b/src/main/example/ftl/HtmlExceptionHandler.java
@@ -0,0 +1,25 @@
+package example.ftl;
+
+import freemarker.core.Environment;
+import freemarker.template.TemplateException;
+import freemarker.template.TemplateExceptionHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.Writer;
+
+public class HtmlExceptionHandler implements TemplateExceptionHandler {
+
+ private final Logger logger = LoggerFactory.getLogger(getClass());
+
+ @Override
+ public void handleTemplateException(TemplateException te, Environment env, Writer out) throws TemplateException {
+ logger.warn(te.getMessage() + "\n" + te.getFTLInstructionStack());
+ try {
+ out.write("???");
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/src/main/example/ftl/HtmlFreeMarkerConfigurer.java b/src/main/example/ftl/HtmlFreeMarkerConfigurer.java
index 4d52287..13906e2 100644
--- a/src/main/example/ftl/HtmlFreeMarkerConfigurer.java
+++ b/src/main/example/ftl/HtmlFreeMarkerConfigurer.java
@@ -1,8 +1,12 @@
package example.ftl;
import freemarker.cache.TemplateLoader;
+import freemarker.log.Logger;
+import freemarker.template.Configuration;
+import freemarker.template.TemplateException;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
+import java.io.IOException;
import java.util.List;
public class HtmlFreeMarkerConfigurer extends FreeMarkerConfigurer {
@@ -18,4 +22,19 @@ protected void postProcessTemplateLoaders(List templateLoaders)
// spring.ftl from classpath will not work with the HtmlTemplateLoader
// use /WEB-INF/templates/spring.ftl instead
}
+
+ @Override
+ protected void postProcessConfiguration(Configuration config) throws IOException, TemplateException {
+ config.setTemplateExceptionHandler(new HtmlExceptionHandler());
+ }
+
+ @Override
+ public void afterPropertiesSet() throws IOException, TemplateException {
+ try {
+ Logger.selectLoggerLibrary(Logger.LIBRARY_SLF4J);
+ } catch (ClassNotFoundException e) {
+ throw new RuntimeException(e);
+ }
+ super.afterPropertiesSet();
+ }
}
diff --git a/src/main/logback.xml b/src/main/logback.xml
index bf37a21..473f959 100644
--- a/src/main/logback.xml
+++ b/src/main/logback.xml
@@ -8,6 +8,7 @@
+