2014-05-02 31 views
0

现状:使用freemarker的处理空

  • 旧的Java项目有很多成品模板伟大的工作。
  • 每个模板都使用数据表单Transaction对象。
  • 此事务处理对象非常大,因为它包含有关事务的所有数据。
  • 在模板中有很多像这样的表达式: get(“object1”)。getNestedObject2()。getNestedObject3()。getValue();

问题: 出现新要求:所有模板都必须为没有真实数据预览过程。所有的数字应该是零,所有的字符串应该是---。

解决方案不能令人满意:

  1. 翻拍的所有模板,以检查空值。 (很多工作并不安全)
  2. 创建包含所有默认值的交易对象。 (很多工作)

那么我的问题是:我可以对Freemarker说,如果他发现空或沿途发现空,他应该用0代替,如果他期待的数字或---如果他期待String。

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

对不起,我的英文。

+0

您正在使用哪个版本的Freemarker和Java?另外,您是否使用其他框架来帮助您将这些技术联系起来? –

+0

我使用的是freeMarker 2.3.20和java 1.7。不,我不使用任何其他框架。 – tosovvoj

回答

1

如果您需要向模板显示虚拟数据模型,则最好的办法可能是自定义ObjectWrapper(请参阅Configuration.setObjectWrapper)。读取数据模型的所有内容都通过TemplateModel-s和TemplateModelObjectWrapper生成,因此它可以控制模板获取哪些名称的值。但问题是,当你必须为名称返回一个虚拟值时,你怎么知道它的类型是什么?这不仅仅是发现它是一个字符串还是一个数字,而且如果它是一种方法(如getNestedObject2)或散列(可以跟在.之后)。有什么可以帮助的,那就是FreeMarker允许一个值有多种类型,所以你可以返回一个可以用作方法的值,例如一个散列和一个字符串。取决于hack的应用可能是足够好的,除了,您仍然需要确定该值是一个字符串还是一个数字,因为${}将打印数字值,如果该值是一个字符串和一个数字。