我正在编写一个 Java 实用程序来使用 freemarker 模板生成输出文件。我有一个使用 freemarker 写入文件的对象列表。例如。我的java对象是一个具有fName、lName和age的雇员。我使用以下代码片段来生成输出文件:
<#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 中是否可行来捕获导致异常的对象。
最佳答案
据我所知,没有简单的方法可以做到这一点。我的想法是扩展 DefaultObjectWrapper
(假设您正在使用它 - 请参阅 Configuration.getObjectWrapper
),因此当通过 TemplateHashModel.get(String)
获取子变量(如 fNameo
)时,您可以在覆盖 TemplateHashModel.get
时捕获由 super.get(String)
抛出的任何异常,然后抛出您自己的异常TemplateException
子类实例,将父对象放入为此添加的字段中。 (而且您可能希望添加原始异常作为异常的原因异常。)
关于java - 在 Freemarker 模板引擎中读取导致 TemplateException 的 Java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57789211/