2013-02-27 5 views
10

Jak zablokować błąd szablonu FreeMarker? Szukam tutaj: http://freemarker.sourceforge.net/docs/pgui_config_errorhandling.html Ale nie rozumiem, jak "TemplateExceptionHandler.IGNORE_HANDLER." Używam Struts2, a także jak wyświetlić inną stronę ftl zamiast wyświetlać śledzenia stosu?Jakie są różne sposoby radzenia sobie z błędami w szablonie 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()); 

Znaleziony powyższy kawałek na http://freemarker.sourceforge.net/docs/pgui_config_errorhandling.html Jak tego używać? Ta ostatnia linia, skąd pochodzi cfg?

„Główne wejście do API FreeMarker” ... http://massapi.com/source/freemarker-2.3.18/src/freemarker/template/Configuration.java.html

Tak, to jest głównym punktem wejścia, jestem zgadywania cfg pochodzi z tej klasy. Nadal nie widzę, jak kontroler wejdzie do mojej klasy MyTemplateExceptionHandler.

Gdzie musi iść następująca linia?

cfg.setTemplateExceptionHandler(new MyTemplateExceptionHandler()); 

I czy to tylko kwestia umieszczenia tej linii we właściwym miejscu?

ten sposób moja obecna klasa wygląda następująco:

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); 
      } 
     } 
    } 
} 

Mój kod jest wchodząc konstruktora MyTemplateExceptionHandler(). Ale nie w MyTemplateExceptionHandler1 handleTemplateException(). Co muszę zrobić?

Wciąż widzę żółty ślad stosu FTL.

To samo dotyczy tego bloga: http://blog.cherouvim.com/freemarker-exception-handling/ Gdzie mogę skonfigurować mój freemarker i jak? Nadal utknąłem, gdzie ta linia musi iść.

Moje inne pytanie brzmi, klasa opublikowana na blogu wydaje się być wewnętrzną klasą, czy po prostu umieszczam tę wewnętrzną klasę w dowolnej klasie, czy jest to zewnętrzna klasa?

Odpowiedz

4

Jeśli chcesz ustawić TemplateExceptionHandler do TemplateExceptionHandler.IGNORE_HANDLER w Struts2 trzeba rozszerzyć org.apache.struts2.views.freemarker.FreemarkerManager klasę zastąpić init i createConfiguration metod i skonfigurować menedżera niestandardową w struts.properties pliku.

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

UPDATE

Niestandardowy FreemarkerManager powinien wyglądać tak:

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; 
} 
} 

Put, że stała w pliku struts.xml:

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

Dowolne przykłady? Gdzie mogę znaleźć przykłady kodu? Jakieś referencje? Gdzie mogę się bardziej w to zagłębić? Dziękuję Ci. –

+0

@NomanArain: Wystarczy spojrzeć na klasę 'org.apache.struts2.views.freemarker.FreemarkerManager'. –

+0

Hej, jeśli mógłbyś odpowiedzieć na moje ostatnie pytanie, które byłoby naprawdę pomocne, proszę. Gdzie ta linia będzie musiała przejść: cfg.setTemplateExceptionHandler (new MyTemplateExceptionHandler()) ;? I czy jest to kwestia umieszczenia tej linii we właściwym miejscu? –

8

Jeśli chcesz obsłużyć go wewnątrz freemarkera, użyj jego attempt-recover mechanizm:

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

Jest to analogiczne do try-catch Javy.

+0

Nie, przygotowuję się do wydania produkcji.Muszę zająć się wszystkim z jednego miejsca.Podoba mi się powyższa odpowiedź, ale nadal nie mogę znaleźć niektórych przykładów tego –

+0

to jest ładne podejście – dom

2

Można również użyć freemarker.properties z następujących key=value:

template_exception_handler = rethrow 

Wystarczy umieścić swój freemarker.properties w ścieżce klasy.

Myślę, że jest to podejście o wiele czystsze.

+0

To wygrał pozwala stworzyć własną aplikację Exceptionhandler –