gpt4 book ai didi

java - FreeMarker 模板中处理错误的不同方法有哪些?

转载 作者:搜寻专家 更新时间:2023-10-30 21:06:25 25 4
gpt4 key购买 nike

如何抑制 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 是从哪里来的?

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

所以,这是主要的入口点,我猜 cfg 来自这个类。我仍然没有看到 Controller 将如何进入我的类 MyTemplateExceptionHandler。

下一行需要去哪里?

cfg.setTemplateExceptionHandler(new MyTemplateExceptionHandler());

是否只是将这条线放在正确位置的问题?

这是我当前类(class)的样子:

    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 constructor()。但不进入 MyTemplateExceptionHandler1 handleTemplateException()。我需要做什么?

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

此博客上指出了同样的事情:http://blog.cherouvim.com/freemarker-exception-handling/我应该在哪里配置我的 freemarker 以及如何配置?我仍然不知道这条线需要去哪里。

我的另一个问题是,博客上发布的类似乎是一个内部类,我只是把那个内部类放到任何类中还是那个是外部类?

最佳答案

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

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

类似于 Java 的 try-catch。

关于java - FreeMarker 模板中处理错误的不同方法有哪些?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15123743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com