java - 在 Freemarker 模板引擎中读取导致 TemplateException 的 Java 对象

标签 java freemarker

我正在编写一个 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/

相关文章:

java - Hibernate:@ManyToOne(fetch = FetchType.LAZY) 不适用于非主键引用列

java - 忽略 FreeMarker 模板中的所有换行符

java - 未找到 Freemarker 模板

java - 使用 USCavalry 转换器将 Velocity 模板转换为 FreeMarker

java - 当尝试部分模拟 void 方法时,我收到 NotAMockException - 我做错了什么?

java - 程序编译,但随后给出错误 Exception in thread "main"java.util.IllegalFormatConversionException : d ! = java.lang.Double?

java - 如何在多个 osgi 包之间共享资源

java - 从 Javascript 调用 Applet 方法

freemarker - 您如何评估和比较 Netsuite 中 item.istaxable 的值(value)?

java - 在 Freemarker 中转储 .vars 中的所有值