2013-10-24 18 views
2

在添加Play框架的同時,我發現非常惱人的情況,我不得不花費很多時間來指出邪惡根源在哪裏!Play框架2.2.0不會自動生成getter/setter

爲了簡化局面讓我們來看看下面的代碼:

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訪問。

它不應該自動生成?該getter和setter方法在運行時產生

回答

1

http://www.playframework.com/documentation/2.2.x/JavaEbean狀態(普通Java庫需要它們),並在編譯時將不可見:

遊戲的設計產生的getter /自動到 確保在運行時(ORM,Databinder,JSON活頁夾等)與庫期望它們可用 的兼容性。如果Play在模型中檢測到任何 用戶編寫的getter/setter,它將不會生成 getter/setter以避免任何衝突。

注意事項:

(1)由於Ebean類增強編譯後出現,不要指望 Ebean生成的getter/setter方法可用在編譯 時間。如果您希望直接對它們進行編碼,可以自己添加 getter/setters,或者確保您的模型類 在項目的其餘部分之前編譯,例如。通過將它們放入一個單獨的子項目 。 (2)增強直接Ebean字段訪問(啓用延遲加載) 僅適用於Java類,不適用於Scala。因此,從Scala源文件(包括標準的Play模板) 訪問的直接字段 不會調用延遲加載,通常導致實體字段爲空(未填充) 。爲了確保填充字段,(a)手動創建getter/setter並調用它們,或者(b)確保實體 在訪問字段之前完全填充。

因此,吸氣劑在您的模板中不可見。 如果您需要延遲加載(請參閱2))我建議您讓您的getter和setters通過IDE生成。 如果你不需要延遲加載,只需訪問這些字段,無論如何它們都是public

BTW:類Person中的參考類Pet命名爲name聽起來像一個尷尬的數據模型,沒有進攻。