我正在 Dropwizard 应用程序中设置视图,并遇到了 Freemarker 的一个奇怪问题。
按照此处的文档,我设置了一个非常简单的示例,如下所示
public class ExampleFreemarkerView extends View {
private Foo foo;
public ContractHtmlView(Foo Foo) {
super("FooView.ftl");
this.foo = foo;
}
public Contract getFoo() { return foo };
}
public class Foo {
public String bar = "Hello World";
}
和FooView.ftl
<html>
<body>
<h1>${foo.bar}</h1>
</body>
</html>
呈现时的预期输出ExampleFreemarkerView
是显示Hello World
.
实际发生的是 Freemarker 抛出一个异常,抱怨${foo.bar}
- 特别bar
是 - 是未定义的。
这似乎是因为bar
是一个公共领域,没有吸气剂。当我向 中添加public String getBar() { return bar; }
吸气剂时Foo
,它可以工作。
我对这种情况感到有些惊讶 - 即 Freemarker 似乎需要 getter 并且不能与开箱即用的公共字段一起工作。我故意在我的模型对象上使用公共字段而不是 getter/setter,因此添加 getter 只是为了使 Freemarker 工作不是我会考虑的解决方案。
我搜索了很多并通读了 Freemarker 文档,但找不到任何方法在 Freemarker 中“打开”这种行为。可能吗?
只是为了感兴趣-我也尝试了上面的示例,完全相同,但是使用 Mustache 模板和公共字段可以正常工作(即{{foo.bar}}
渲染Hello World
没有问题)。这解决了眼前的问题,所以这个问题主要是出于好奇,或者我出于其他原因决定使用 Freemarker 而不是 Mustache。
根据评论进行编辑-我知道 Freemarker 这样做(坚持使用 getters 开箱即用)遵循 Java Beans 规范,但 Java 生态系统中的大多数库都支持公共领域 - Hibernate 和 Jackson 是突出的例子 - 在我个人看来它作为一个同样有效的标准,并且发现不支持它的库令人惊讶。