Play Framework 2.0 中公共字段的使用

Posted

技术标签:

【中文标题】Play Framework 2.0 中公共字段的使用【英文标题】:Use of public fields in Play Framework 2.0 【发布时间】:2012-03-30 02:52:14 【问题描述】:

在 Play Framework 1.x 中,约定是在 Java 类上使用公共字段。这样做的理由是因为播放属性增强器的工作方式如下所述:http://www.playframework.org/documentation/1.2.4/model

简而言之,公共字段是“好的”,因为 Play 在运行时自动生成 setter 和 getter。这对我来说是有道理的,还有其他问题涵盖了这一点。

Play Framework 2.0 的工作方式非常不同。没有“属性模拟”功能。也许他们正在考虑稍后添加此内容,但我找不到任何建议。如果没有属性模拟,使用所有公共字段的原始理由就消失了。 Play Framework 2.0 示例仍然使用公共字段: http://www.playframework.org/documentation/2.0/JavaEbean

为什么仍然建议在 playframework 2.0 中使用公共字段?这只是创建示例的旧版本 play 的开发人员的习惯,还是 Play 2.0 仍然建议使用公共字段的另一个原因?

【问题讨论】:

【参考方案1】:

查看文档:https://github.com/playframework/Play20/wiki/JavaEbean,Play 将为我们生成缺少的访问器。

然而,他们对这种技术有一些警告,最重要的是 ebean 工具无法在生成 get/setter 上工作......因此可能会发生问题(事务,......)

以下是相关引述:

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 2 模板)直接访问字段不会调用延迟加载,通常会导致空的(未填充的)实体字段。要确保填充字段,请 (a) 手动创建 getter/setter 并改为调用它们,或者 (b) 确保在访问字段之前完全填充实体。

HTH

【讨论】:

【参考方案2】:

我猜这是因为带有公共 getter 和 setter 的私有字段只会产生线路噪音,不会增加任何实际价值。在 Scala 中,getter 和 setter 也不可见,它们也是自动生成的。例如:

class Person(var name: String)
val a = new Person("John Smith")
a.name = "Henry Smith"

Play 受到 Rails 的启发,Ruby 也有自动生成 getter 和 setter 的语法:

class Person
  attr_accessor :name
end

person = Person.new
person.name = "John Henry"

【讨论】:

以上是关于Play Framework 2.0 中公共字段的使用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Play Framework 2.0 (Scala) 中插入测试数据?

如何使用 Play Framework 2.0 下载文件

Play Framework [2.4.x] 如何在子模块的路由文件中处理公共资产

Play Framework 未获取对公共文件的更改

Play framework 2.0 尝试级联删除时出错“参数“#1”未设置;SQL语句:delete”

使用 dist 命令后在哪里放置 play framework 的公共目录