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我可以通过person.name.

它不应该自动生成吗?

4

1 回答 1

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/setter,或者确保在项目的其余部分之前编译您的模型类,例如。通过将它们放在一个单独的子项目中。

(2) 增强直接 Ebean 字段访问(启用延迟加载)仅适用于 Java 类,不适用于 Scala。因此,从 Scala 源文件(包括标准 Play 模板)直接访问字段不会调用延迟加载,这通常会导致空的(未填充的)实体字段。为确保字段被填充,要么 (a) 手动创建 getter/setter 并改为调用它们,要么 (b) 在访问字段之前确保实体已完全填充。

因此,getter 在您的模板中不可见。如果您需要延迟加载(请参阅2))我建议您让您的 getter 和 setter 由您的 IDE 生成。如果您不需要延迟加载,只需访问这些字段,public无论如何它们都是。

顺便说一句:类Person中对Pet命名类的引用name听起来像是一个尴尬的数据模型,没有冒犯。

于 2014-01-29T18:30:56.073 回答