【问题标题】:Freemarker multiple Configuration instancesFreemarker 多个配置实例
【发布时间】:2014-04-10 13:09:34
【问题描述】:

我正在尝试创建两个单独的 freemarker 配置实例。我有这样的抽象类

public abstract class AbstractFreemarkerConfiguration {

Logger logger = LoggerFactory.getLogger(AbstractFreemarkerConfiguration.class);

Configuration cfg = new Configuration();

public AbstractFreemarkerConfiguration() throws IOException, TemplateModelException {
    logger.info("Initializing Freemarker Config");
    cfg.setDefaultEncoding("UTF-8");
    setTemplateExceptionHandler();
    cfg.setSharedVariable("layout", getLayoutDirectives());
    cfg.setTemplateUpdateDelay(0);
    cfg.setLocalizedLookup(false);

}

@Autowired
@Qualifier("databaseTemplateLoader")
public void setTemplateLoader(TemplateLoader loader){
    logger.info("Setting hibernate teplate loader");
    cfg.setTemplateLoader(loader);

}

public abstract void setTemplateExceptionHandler();
}

然后我有两个这样的课程

@Component("freemarkerProcessor")
public class FreemarkerTemplateProcessor extends AbstractFreemarkerConfiguration implements TemplateProcessor {

public FreemarkerTemplateProcessor() throws IOException, TemplateModelException {
    super();
}

private Environment process(Object template) {
    Writer writer = new NullWriter();
    //do stuff
}

@Override
public List<String> getIncludes(Object template) {
    //do stuff
}

@Override
public void setTemplateExceptionHandler() {
    cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
}

}

和第二个基本相同,只是将 Template Exception Handler 设置为 RETHROW_HANDLER

我的问题是,当我这样做时,我在 IGNORE HANDLER 中遇到异常,它将通过 RETHROW 而不是忽略它。

在调试中,我确定我必须分离 Configuration 和 TemplateExpetionHandler 的实例,所以我不知道为什么会出现 IGNORE HANDLER 异常。

是否有一些全局配置设置或我不知道的东西?

感谢您的回复。

【问题讨论】:

  • 您看到的是什么类型的异常? TemplateExceptionHandler 只处理 TemplateException 的实例。
  • 关于模型中缺少数据的 TemplateException。
  • 不,TemplateExceptionHandler 没有全局缓存等。您是否也尝试过在第一个实例中使用 IGNORE_HANDLER ?因为如果随后行为发生变化,则证明 (1) IGNORE_HANDLER 正在按预期工作,并且 (2) 您出于某种原因正在使用第一个 cfg,而您正在使用第二个。

标签: java spring freemarker


【解决方案1】:

所以我想通了。我有两个春季服务,一个是 IGNORE,一个是 RETHROW。我正在使用 RETHROW 从那个获得 freemarker 模板对象,并且似乎模板对象根据原始配置保持 ExceptionHandler 设置。

所以当我在 IGNORE 一个中处理来自 RETHROW 一个的模板时,它仍然使用 RETHROW,因为该模板来自该配置。

当我从 IGNORE 一个加载模板时,它甚至在 RETHROW 一个上也一直忽略。 这对我来说绝对是出乎意料的行为。

【讨论】:

    猜你喜欢
    • 2015-11-05
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多