Play framework 2.2.0不会自动生成getter / setter

时间:2013-10-24 13:41:55

标签: java scala playframework-2.2

在解决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。

它不应该自动生成?

1 个答案:

答案 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的引用听起来像一个尴尬的数据模型,没有冒犯。