13

FreeMarkerテンプレートエラーを抑制する方法は?私はここを探しています:http://freemarker.sourceforge.net/docs/pgui_config_errorhandling.html しかし、「TemplateExceptionHandler.IGNORE_HANDLER」の方法がわかりません。Struts2を使用していますが、スタックトレースを表示する代わりに別のftlページを表示する方法もありますか?

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はどこから来たのですか?

「FreeMarkerAPIへのメインエントリポイント」... 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/フリーマーカーをどこでどのように構成すればよいですか?私はまだその線がどこに行く必要があるかについて立ち往生しています。

私の他の質問は、ブログに投稿されたクラスは内部クラスのようですが、その内部クラスを任意のクラスに入れるだけですか、それとも外部クラスですか?

4

3 に答える 3

10

freemarker 内で処理したい場合は、その試行回復メカニズムを使用します。

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

Java の try-catch に似ています。

于 2013-02-28T15:43:08.587 に答える
4

Struts2 で設定TemplateExceptionHandlerする場合は、クラス、オーバーライド、およびメソッドTemplateExceptionHandler.IGNORE_HANDLERを拡張し、ファイルでカスタム マネージャーを構成する必要があります。org.apache.struts2.views.freemarker.FreemarkerManagerinitcreateConfigurationstruts.properties

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

アップデート

カスタム 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" /> 
于 2013-02-28T09:05:56.597 に答える