在解决Play框架问题时,我发现非常烦人的情况,我不得不花太多时间指出邪恶的根源在哪里!
为了简化这种情况,我们考虑以下代码:
在controllers.Application.java
:
return ok(views.html.method1.render(Person.find.all());
在method1.scala.html
:
@(people : List[Person])
...
@for(person <- people) {
@person.name
@person.pet.getName()
@person.pet.name
}
在Person.java
:
@Id
public Long id;
@ManyToOne
public Pet name;
...
问题是当我在Pet
类中手动设置getName()方法时。返回值。
但是当我让Play框架自动生成时,它不会返回任何值!
当然,Play框架已生成person
的getter,我可以通过person.name
访问该getter。
它不应该自动生成?
答案 0 :(得分:1)
http://www.playframework.com/documentation/2.2.x/JavaEbean表示getter和setter是在运行时生成的(对于需要它们的普通旧Java库)并且在编译时不可见:
Play已被设计为自动生成getter / setter 确保与期望它们可用的库兼容 在运行时(ORM,Databinder,JSON Binder等)。如果Play检测到任何 在Model中用户编写的getter / setter,它不会生成 getter / setter以避免任何冲突。
注意事项:
(1)因为编译后发生了Ebean类增强,所以不要 期望Ebean生成的getter / setter在编译时可用 时间。如果您更喜欢直接使用它们进行编码,请添加 getter / setters明确自己,或确保您的模型类 在项目的其余部分之前编译,例如。通过把他们 在一个单独的子项目中。
(2)增强直接Ebean字段访问(启用延迟加载) 仅适用于Java类,而不适用于Scala。因此,直接领域 从Scala源文件(包括标准Play模板)访问 不调用延迟加载,经常导致空(无人居住) 实体领域。要确保填充字段,请(a)手动填写 创建getter / setter并改为调用它们,或者(b)确保实体 在访问字段之前已完全填充。
因此,模板中看不到吸气剂。
如果你需要延迟加载(参见 2),我建议你让你的IDE生成getter和setter。
如果您不需要延迟加载,只需访问字段,无论如何它们都是public
。
顺便说一句:类Person
中对名为Pet
的类name
的引用听起来像一个尴尬的数据模型,没有冒犯。