2013-02-27 61 views
10

如何禁止FreeMarker模板错误?我在看:http://freemarker.sourceforge.net/docs/pgui_config_errorhandling.html 但我不明白“TemplateExceptionHandler.IGNORE_HANDLER”。我正在使用Struts2以及如何显示另一个ftl页面而不是显示堆栈跟踪?在FreeMarker模板中处理错误有哪些不同的方法?

class MyTemplateExceptionHandler implements TemplateExceptionHandler { 
    public void handleTemplateException(TemplateException te, Environment env, java.io.Writer out) 
      throws TemplateException { 
     try { 
      out.write("[ERROR: " + te.getMessage() + "]"); 
     } catch (IOException e) { 
      throw new TemplateException("Failed to print error message. Cause: " + e, env); 
     } 
    } 
} 

... 

cfg.setTemplateExceptionHandler(new MyTemplateExceptionHandler()); 

找到在http://freemarker.sourceforge.net/docs/pgui_config_errorhandling.html 如何使用这上面的一块?最后一行,cfg从哪里来?

“主入口点FreeMarker的API” ...... http://massapi.com/source/freemarker-2.3.18/src/freemarker/template/Configuration.java.html

所以,这是主要的切入点,我猜CFG来自这个班。我仍然没有看到控制器将如何进入MyTemplateExceptionHandler类。

下一行需要去哪里?

cfg.setTemplateExceptionHandler(new MyTemplateExceptionHandler()); 

而这仅仅是把这条线放在正确的位置吗?

这是我当前类的样子:

import java.io.File; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.Writer; 
import java.util.Properties; 

import freemarker.cache.FileTemplateLoader; 
import freemarker.cache.MultiTemplateLoader; 
import freemarker.cache.TemplateLoader; 
import freemarker.cache.WebappTemplateLoader; 
import freemarker.core.Environment; 
import freemarker.ext.beans.BeansWrapper; 
import freemarker.ext.jsp.TaglibFactory; 
import freemarker.ext.servlet.HttpRequestHashModel; 
import freemarker.ext.servlet.HttpRequestParametersHashModel; 
import freemarker.ext.servlet.HttpSessionHashModel; 
import freemarker.ext.servlet.ServletContextHashModel; 
import freemarker.template.ObjectWrapper; 
import freemarker.template.TemplateException; 
import freemarker.template.TemplateExceptionHandler; 
import freemarker.template.TemplateModel; 

import javax.servlet.GenericServlet; 
import javax.servlet.ServletContext; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 

import org.apache.struts2.views.JspSupportServlet; 
import org.apache.struts2.views.freemarker.FreemarkerManager; 
import org.apache.struts2.views.freemarker.ScopesHashModel; 
import org.apache.struts2.views.freemarker.StrutsBeanWrapper; 
import org.apache.struts2.views.freemarker.StrutsClassTemplateLoader; 
import org.omg.CORBA.PUBLIC_MEMBER; 

import com.opensymphony.xwork2.ActionInvocation; 
import com.opensymphony.xwork2.util.FileManager; 
import com.opensymphony.xwork2.util.ValueStack; 

public class MyTemplateExceptionHandler extends org.apache.struts2.views.freemarker.FreemarkerManager { 

    freemarker.template.Configuration configuration = new freemarker.template.Configuration(); 

    public MyTemplateExceptionHandler() { 
     System.out.println("MyTemplateExceptionHandler constructor()"); 
     configuration.setTemplateExceptionHandler(new Test1()); 
    } 

    class Test1 implements TemplateExceptionHandler { 

     @Override 
     public void handleTemplateException(TemplateException te, Environment env, java.io.Writer out) throws TemplateException { 
      System.out.println("MyTemplateExceptionHandler1 handleTemplateException()"); 
      try { 
       out.write("[ERROR TEST TEST: " + te.getMessage() + "]"); 
      } catch (IOException e) { 
       throw new TemplateException("Failed to print error message. Cause: " + e, env); 
      } 
     } 
    } 
} 

我的代码进入MyTemplateExceptionHandler构造函数()。但是不能进入MyTemplateExceptionHandler1的handleTemplateException()。我需要做什么?

我仍然看到黄色的FTL堆栈跟踪。

同样的事情正在这个博客上指出:http://blog.cherouvim.com/freemarker-exception-handling/在哪里激动地配置我的freemarker以及如何?我仍然坚持该线路需要去哪里。

我的另一个问题是,在博客上发布的类似乎是一个内部类,我只是将该内部类放入任何类或是外部类?

回答

4

如果你想设置TemplateExceptionHandlerTemplateExceptionHandler.IGNORE_HANDLER在Struts2您需要扩展org.apache.struts2.views.freemarker.FreemarkerManager类,重写initcreateConfiguration方法和struts.properties文件中配置自定义的经理。

struts.freemarker.manager.classname = your.package.YourFreeMarkerManager 

UPDATE

您的自定义FreemarkerManager应该看起来像:

public class MyFreemarkerManager extends 
    org.apache.struts2.views.freemarker.FreemarkerManager { 

private static final Logger LOG = LoggerFactory 
     .getLogger(MyFreemarkerManager.class); 

@Override 
public void init(ServletContext servletContext) throws TemplateException { 
    config = createConfiguration(servletContext); 

    // Set defaults: 
    config.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER); 
    contentType = DEFAULT_CONTENT_TYPE; 

    // Process object_wrapper init-param out of order: 
    wrapper = createObjectWrapper(servletContext); 
    if(LOG.isDebugEnabled()) { 
     LOG.debug("Using object wrapper of class " + wrapper.getClass().getName()); 
    } 
    config.setObjectWrapper(wrapper); 

    // Process TemplatePath init-param out of order: 
    templatePath = servletContext.getInitParameter(INITPARAM_TEMPLATE_PATH); 
    if(templatePath == null) { 
     templatePath = servletContext.getInitParameter("templatePath"); 
    } 

    config 
      .setTemplateLoader(createTemplateLoader(servletContext, templatePath)); 

    loadSettings(servletContext); 
} 

@Override 
protected Configuration createConfiguration(ServletContext servletContext) 
     throws TemplateException { 
    Configuration configuration = new Configuration(); 

    configuration 
      .setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER); 

    if(mruMaxStrongSize > 0) { 
     configuration.setSetting(Configuration.CACHE_STORAGE_KEY, "strong:" 
       + mruMaxStrongSize); 
    } 
    if(templateUpdateDelay != null) { 
     configuration.setSetting(Configuration.TEMPLATE_UPDATE_DELAY_KEY, 
       templateUpdateDelay); 
    } 
    if(encoding != null) { 
     configuration.setDefaultEncoding(encoding); 
    } 

    configuration.setWhitespaceStripping(true); 

    return configuration; 
} 
} 

把那不断在你的struts.xml文件:

<constant name="struts.freemarker.manager.classname" value="your_package.MyFreemarkerManager" /> 
+0

任何示例?在哪里我可以找到一些代码示例?任何参考?我在哪里可以看到更多?谢谢。 – 2013-02-28 15:00:02

+0

@NomanArain:查看'org.apache.struts2.views.freemarker.FreemarkerManager'类。 – 2013-02-28 19:24:08

+0

嘿,如果你能回答我的最新问题,请真的有帮助。这行代码需要去哪里:cfg.setTemplateExceptionHandler(new MyTemplateExceptionHandler());?这只是把这条线放在正确位置的问题吗? – 2013-02-28 19:28:32

8

如果你想在freemarker里面处理它,使用它的attempt-recover机制:

<#attempt> 
    attempt block 
<#recover> 
    recover block 
</#attempt> 

它类似于Java的try-catch。

+0

不,我准备生产发布。我需要处理一切从一个地方。我喜欢上面的答案,但我仍然找不到一些这样的例子。 – 2013-02-28 15:46:16

+0

这是不错的方法 – dom 2017-07-01 07:03:08

2

您也可以通过以下key=value使用freemarker.properties

template_exception_handler = rethrow 

只要把你的freemarker.properties在classpath中。

我认为这是一个更清洁的方法。

+0

这赢了不可能创建你自己的Exceptionhandler – 2018-01-09 14:22:37