【问题标题】:Handling null in Freemarker在 Freemarker 中处理 null
【发布时间】:2014-06-19 06:50:51
【问题描述】:

情况:

  • 使用 freemarker 的旧 java 项目有许多成品模板运行良好。
  • 每个模板都使用数据表单事务对象。
  • 这个交易对象非常大,因为它包含了所有关于交易的数据。
  • 在模板中有很多这样的表达式: get("object1").getNestedObject2().getNestedObject3().getValue();

问题: 新要求出现:所有模板都必须经过处理才能进行预览,没有真实数据。所有数字都应该为零,所有字符串都应该是---。

不满意的解决方案:

  1. 重新制作所有模板以检查空值。 (工作量大,不安全)
  2. 创建包含所有默认值的事务对象。 (大量工作)

我的问题是:我可以对 Freemarker 说,如果他发现 null 或一路上发现 null,如果他期待数字或 --- 如果他期待 String,他应该使用 0 代替。

或者你能找到更好的解决方案吗?

【问题讨论】:

  • 您使用的是哪个版本的 Freemarker 和 Java?另外,您是否使用任何其他框架来帮助您将这些技术联系起来?
  • 我正在使用 freeMarker 2.3.20 和 java 1.7。不,我不使用任何其他框架。
  • 你能把你的交易对象转换成平面图来简化一切吗?
  • 我没有看到任何简单的方法来做到这一点。看起来工作量很大。

标签: java null freemarker


【解决方案1】:

如果您需要向模板显示虚拟数据模型,最好的选择可能是自定义ObjectWrapper(请参阅Configuration.setObjectWrapper)。读取数据模型的所有内容都通过TemplateModel-s 运行,而根TemplateModelObjectWrapper 创建,因此它可以控制模板为什么名称获取什么值。但问题是,当你必须为一个名字返回一个虚拟值时,你怎么知道它的类型是什么?这不仅仅是要找出它是一个字符串还是一个数字,还要找出它是一个方法(如getNestedObject2)还是一个哈希(后面可以跟.)。有什么帮助是 FreeMarker 允许一个值具有多种类型,因此您可以返回一个可以用作方法、哈希和字符串的值,例如。根据 hack 可能足够好的应用程序,除了,您仍然必须决定该值是字符串还是数字,因为如果值既是字符串又是数字,${} 将打印数值。

【讨论】:

    猜你喜欢
    • 2012-12-06
    • 2013-04-11
    • 1970-01-01
    • 2011-01-11
    • 2017-02-08
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多