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 フレームワークによって自動生成されるようにすると、値が返されません!

person確かに、Play フレームワークはでアクセスできるゲッターを生成しましたperson.name

自動的に生成されるべきではありませんか?

4

1 に答える 1

1

http://www.playframework.com/documentation/2.2.x/JavaEbeanは、ゲッターとセッターが実行時に生成され (それらを必要とするプレーンな古い Java ライブラリの場合)、コンパイル時には表示されないと述べています。

Play は getter/setter を自動的に生成するように設計されており、実行時に利用できることを期待するライブラリ (ORM、Databinder、JSON Binder など) との互換性を確保します。Play が Model でユーザー作成の getter/setter を検出した場合、競合を避けるために getter/setter を生成しません。

警告:

(1) Ebean クラスの拡張はコンパイル後に行われるため、Ebean によって生成された getter/setter がコンパイル時に使用可能になるとは思わないでください。それらを直接コーディングしたい場合は、ゲッター/セッターを自分で明示的に追加するか、プロジェクトの残りの部分の前にモデル クラスがコンパイルされるようにします。それらを別のサブプロジェクトに入れることによって。

(2) Ebean フィールドへの直接アクセスの拡張 (遅延ロードの有効化) は Java クラスにのみ適用され、Scala には適用されません。したがって、Scala ソース ファイル (標準の Play テンプレートを含む) からのフィールドへの直接アクセスは、遅延読み込みを呼び出さず、多くの場合、空の (値が入力されていない) エンティティ フィールドになります。フィールドにデータが入力されるようにするには、(a) getter/setter を手動で作成して代わりに呼び出すか、(b) フィールドにアクセスする前にエンティティが完全に入力されていることを確認します。

したがって、ゲッターはテンプレートに表示されません。遅延読み込み ( 2)を参照) が必要な場合は、ゲッターとセッターを IDE で生成することをお勧めします。遅延読み込みが必要ない場合は、フィールドにアクセスするだけpublicです。

ところで: class 内のPersonclassPetという名前の参照はname、ぎこちないデータ モデルのように聞こえますが、問題はありません。

于 2014-01-29T18:30:56.073 に答える