Java Freemarker:在模板中不使用getter访问公共字段

Java Freemarker:在模板中不使用getter访问公共字段,java,freemarker,dropwizard,public-members,dropwizard-templates,Java,Freemarker,Dropwizard,Public Members,Dropwizard Templates,我在Dropwizard应用程序中设置视图时遇到了Freemarker的一个奇怪问题 按照下面的步骤,我建立了一个非常简单的示例 公共类示例FreeMarkerView扩展视图{ 私人富福; 公共合同HTMLVIEW(Foo-Foo){ 超级(“FooView.ftl”); this.foo=foo; } 公共合同getFoo(){return foo}; } 公开课Foo{ 公共字符串bar=“Hello World”; } 使用FooView.ftl <html> <

我在Dropwizard应用程序中设置视图时遇到了Freemarker的一个奇怪问题

按照下面的步骤,我建立了一个非常简单的示例

公共类示例FreeMarkerView扩展视图{
私人富福;
公共合同HTMLVIEW(Foo-Foo){
超级(“FooView.ftl”);
this.foo=foo;
}
公共合同getFoo(){return foo};
}
公开课Foo{
公共字符串bar=“Hello World”;
}
使用
FooView.ftl

<html>
  <body>
    <h1>${foo.bar}</h1>
  </body>
</html>

${foo.bar}
呈现
示例FreeMarkerView
时的预期输出是显示
Hello World
的HTML文档

实际发生的情况是Freemarker抛出一个异常,抱怨
${foo.bar}
——特别是
bar
——未定义

这似乎是因为
bar
是一个公共字段,没有getter。当我向
Foo
添加一个
公共字符串getBar(){return bar;}
getter时,它会工作

我有点惊讶于这种情况——即Freemarker似乎需要getter,并且不能在开箱即用的情况下处理公共字段。我故意在模型对象上使用公共字段而不是吸气剂/设置器,所以添加GETTER只是为了让FrimaLARK工作不是我要考虑的解决方案。 我在谷歌上搜索了很多,阅读了Freemarker的文档,但就是找不到任何方法来“开启”Freemarker中的这种行为可能吗?

只是出于兴趣-我也尝试了上面的示例,完全相同,但是使用了一个小胡子模板和公共字段就可以了(即
{{foo.bar}
渲染
Hello World
,没有问题)。这就解决了眼前的问题,所以这个问题主要是出于好奇,或者我出于其他原因决定在胡子上使用Freemarker


根据评论进行编辑-我知道Freemarker这样做(坚持让getter跳出框)是为了遵循JavaBeans规范,但是Java生态系统中的大多数库都支持公共领域——Hibernate和Jackson是突出的例子——在某种程度上,我个人认为它是一个同样有效的标准,并且发现库不支持它是令人惊讶的

每个对象都将被包装到一个TemplateHashModel中,该模型将公开对象的JavaBeans属性和方法。这样,您就可以在模板中使用model.foo来调用obj.getFoo()或obj.isFoo()方法。(注意,公共字段不直接可见;您必须为它们编写一个getter方法

注意,它也是follow


此外,您还可以仅使用类注释自动将框架用作lombok,这取决于
objectWrapper
配置设置。大多数项目使用的
DefaultObjectWrapper
(以及任何
BeansWrapper
子类)具有
exposeFields
设置,可以设置为
true

在Dropwizard中,如果您以兼容的方式设置
ViewBundle
,则可以在配置YML中这样做(基于):


您能解释一下为什么使用公共字段而不是getter/setter吗?首先请注意,这是专门针对数据类的,即模型对象-我发现这里不需要封装或抽象。这个类的唯一用途是保存数据——它完全是哑的,不需要做任何像验证或其他任何事情这样的魔术。对于这样的类,我觉得只使用公共字段更干净、更简单。我也很好地解释了这个问题,用了比我在这里能用的更多的词。谢谢你的回答,我在问题中可能没有说得足够清楚,但我知道这是开箱即用的,并且理解了原因(遵循JavaBeans规范等)。我感兴趣的是,是否有一种配置Freemarker的方法,使公共字段可以直接看到,或者是对库来说,这是一种明确的哲学难题。我在文件里找不到这样的陈述,所以我很好奇。
viewRendererConfiguration:
  freemarker:  # was `.ftl:` before Dropwizard 1.3.0
    objectWrapper=DefaultObjectWrapper(2.3.28, exposeFields=true)