java - 在 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中是否可行以捕获导致异常的对象。
解决方案
据我所知,没有简单的方法可以做到这一点。我的想法是扩展DefaultObjectWrapper
(假设您正在使用它 - 请参阅Configuration.getObjectWrapper
),因此当子变量(如fNameo
)通过TemplateHashModel.get(String)
时,您可以捕获super.get(String)
在您的覆盖中抛出的任何异常TemplateHashModel.get
,然后抛出您自己的TemplateException
子类实例,您将您为此添加的字段中的父对象。(而且您可能还想将原始异常添加为异常的原因异常。)
推荐阅读
- windows - 即使从批处理文件启动的程序已终止,如何保持控制台窗口打开?
- ios - ObjectiveC - WebView 没有从顶部重新加载
- c - bluez 适配器 api StartDiscovery 超时
- java - 为什么 IntelliJ 需要 Lombok 插件?
- django - 为什么我会违反 ForeignKey 约束
- azure - 带存储的 Azure Powershell
- asp.net - 是否可以为无效凭据自定义 ADFS 登录消息
- oracle - 在 Debian 8 上安装 Oracle 12c
- xpath - Xpath scrapy过滤过滤后的选择器
- c++ - char 而不是 std::atomic_flag 或 std::atminc_bool