首页 > 解决方案 > 在 Freemarker 模板引擎中读取导致 TemplateException 的 Java 对象

问题描述

我正在编写一个 Java 实用程序来使用 freemarker 模板生成输出文件。我有一个使用 freemarker 写入文件的对象列表。例如,我的 java 对象是具有 fName、lName 和年龄的员工。我正在使用以下代码片段来生成输出文件:

<#list employees as e>
Fname: ${e.fName} Lname: ${e.lName} Age: ${e.age}
</#list>

现在,我正在使用自定义模板异常处理程序来处理异常,以防员工对象中缺少 fName、lName 或年龄。

configuration.setTemplateExceptionHandler(new FreemarkerExceptionHandler());

我想读取在 FreemarkerExceptionHandler 类中引发异常的员工对象,但无法读取它。我正在使用以下代码来读取员工列表,但我正在获取所有员工,而不是导致此错误的特定员工。

TemplateHashModel templateHashModel = environment.getDataModel();

TemplateModel templateModel = templateHashModel.get("employees");
List<Employee> emps = simpleSequence.toList();

任何人都可以确认这在freemarker中是否可行以捕获导致异常的对象。

标签: javafreemarker

解决方案


据我所知,没有简单的方法可以做到这一点。我的想法是扩展DefaultObjectWrapper(假设您正在使用它 - 请参阅Configuration.getObjectWrapper),因此当子变量(如fNameo)通过TemplateHashModel.get(String)时,您可以捕获super.get(String)在您的覆盖中抛出的任何异常TemplateHashModel.get,然后抛出您自己的TemplateException子类实例,您将您为此添加的字段中的父对象。(而且您可能还想将原始异常添加为异常的原因异常。)


推荐阅读