Ich benutze Struts-2.3.16 und ich muss Ausnahmen von Freemarker Vorlage global in unserer Anwendung zu unterdrücken. Dies bedeutet, dass ich anstelle des gelben Bildschirms mit dem Stacktrace von Freemarker an ein globales JSP weiterleiten muss, das eine generische Nachricht anzeigt, so dass die Anzeige von Stacktraces für den Benutzer verhindert wird. Für generische Ausnahmen in Struts haben wir ein global-result in struts.xml gemappt, aber es funktioniert nicht für Freemarker-Ausnahmen.Suppress Freemarker Vorlage Fehler
Bisher habe ich die Lösung von What are different ways to handle error in FreeMarker template? implementiert. Also habe ich einen CustomFreemarkerManager und einen CustomTemplateExceptionHandler erstellt.
Mein CustomFreemarkerManager sieht wie folgt aus:
@Override
public void init(ServletContext servletContext) throws TemplateException {
super.config = super.createConfiguration(servletContext);
super.config.setTemplateExceptionHandler(new CustomTemplateExceptionHandler(servletContext));
super.contentType = "text/html";
super.wrapper = super.createObjectWrapper(servletContext);
if (LOG.isDebugEnabled()) {
LOG.debug("Using object wrapper of class " + super.wrapper.getClass().getName(), new String[0]);
}
super.config.setObjectWrapper(super.wrapper);
super.templatePath = servletContext.getInitParameter("TemplatePath");
if (super.templatePath == null) {
super.templatePath = servletContext.getInitParameter("templatePath");
}
super.configureTemplateLoader(super.createTemplateLoader(servletContext, super.templatePath));
super.loadSettings(servletContext);
}
@Override
protected Configuration createConfiguration(ServletContext servletContext) throws TemplateException {
Configuration configuration = new Configuration();
configuration.setTemplateExceptionHandler(new CustomTemplateExceptionHandler(servletContext));
if (super.mruMaxStrongSize > 0) {
configuration.setSetting("cache_storage", "strong:" + super.mruMaxStrongSize);
}
if (super.templateUpdateDelay != null) {
configuration.setSetting("template_update_delay", super.templateUpdateDelay);
}
if (super.encoding != null) {
configuration.setDefaultEncoding(super.encoding);
}
configuration.setLocalizedLookup(false);
configuration.setWhitespaceStripping(true);
return configuration;
}
Von hier aus ich die ServletContext meiner CustomTemplateExceptionHandler senden, so kann ich ein Request erstellen, um meine exception.jsp zu übermitteln. Das Problem ist, dass ich im Ausnahmebehandler die Anfrage und die Antwort nicht habe und ich kann nicht zu meinem JSP weiterleiten.
Die Klasse CustomTemplateExceptionHandler sieht wie folgt aus so weit:
private ServletContext servletContext;
public CustomTemplateExceptionHandler(ServletContext servletContext) {
this.servletContext = servletContext;
}
public void handleTemplateException(TemplateException te, Environment env, Writer out) throws TemplateException {
if (servletContext != null) {
RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/resources/exception.jsp");
//HERE I have to forward to my jsp
}
}
Wer weiß, wie kann ich das tun? Ich möchte, dass der Stacktrace nur auf dem Server und in der Benutzeroberfläche protokolliert wird, um den Stacktrace durch eine generische Nachricht zu ersetzen.
Ja, Sie haben Recht. Sie können versuchen, Redirect mit dem Ausnahmebehandler zu drucken. Siehe http://freemarker.624813.n4.nabble.com/URL-redirect-in-ftl-td625576.html. –
Sehen Sie, wie 'HTML_DEBUG_HANDLER' prints - https://github.com/apache/incubator-freemarker/blob/2.3-gae/src/main/java/freemarker/template/TemplateExceptionHandler.java#L98. BTW gute Frage. :) –