2011-12-15 6 views
0

privateフィールドを持つクラスがあり、getXメソッドなしでテンプレートにアクセスできなかったと思われますが、値はpublicのように表示されます。プレーフレームワークテンプレートをプライベートフィールドにアクセスさせるのはなぜですか?

class Task { 
    private String title = ""; 
} 

テンプレートには、次のコードでtitleを表示することができます。私はそれが反射魔法によるものであるが、ゲッターせずにプライベートフィールドをレンダリングすることは不可能であってはならないと思い

${task.title} 

答えて

1

フレームワークでは、唯一の公共分野ためセッターとゲッターを生成しますが、テンプレート言語は、GroovyのですGroovyのは、何のカプセル化を持っていないように見えるとして、非アクセスできるフィールドは、テンプレートから任意の制約を受けることなくアクセスすることができますコード。

私はバグを報告しましたが、Play 1.xがそのテンプレート用にGroovyを中継しているため、修正できないのかどうかは本当に分かりません(今後の2.0バージョンでは、 )。

実際にアクセスを制限する必要がある場合は、をご覧ください。SecurityManagersプライベートフィールドでの反映を防ぐことができますが、制限をどれくらい正確に設定できるかはわかりません。


2

私の推測では、フレームワークはゲッターとセッターのメソッドを動的に追加しています。 "override"を返すString getTitle()メソッドを作成してみてください。

+0

'のgetTitle()'メソッドが呼び出され、そのプレイは自動的にゲッターを生成しているように思えるされます。しかし、[documentation](http://www.playframework.org/documentation/1.2.4/model#properties)によれば、これはクラスのパブリックで非静的で非最終的なフィールドに対してのみ行われると言われています。 – deamon

関連する問題