2017-03-31 9 views
0

(背景:私はオフとオンのどこかの周りの18年間のJava Beanと取り組んできた、私は:-)週または2のためにFreemarkerので取り組んできました)FreemarkerはMethodDescriptorsを尊重しますか?

私が持っている手箔押しBeanInfoメソッドの命名の "普通の"(しかし明らかに任意の)get/setスタイルに従わないクラスのプロパティを表す。

意味的に、xという名前のJava Beanプロパティの場合、このクラスのメソッドx()を呼び出します。

私のBeanInfoの実装(Freemarkerが見つけて読み込んでいる)はこのパターンを実装しています。ファイン。問題の

クラスは、実際に方法は(のはここTargetそれを呼びましょう)特定のオブジェクトを返す、target()と呼ばれ、その名前がtargetreadMethodその方法であるPropertyDescriptorで表されています。ファイン。私Freemarkerのテンプレートで

、私がしなければ、この:

theObject.target 

技術的に発見できるのに...私は、私のPropertyDescriptorことを示唆し、効果的方法、ない財産であるtargetというエラーを取得し、相談されていません。代わりにこれを変更すると:

theObject.target() 

...すべてが動作します。換言すればFreemarkerがFreemarkerの手法で見ているように思われます。FreemarkerはPropertyDescriptorに「通過」していないようです。そうしないと、実際にはJava Beanプロパティの「読み取りメソッド」です。 。

私は、おそらくそれが問題だったことを考え、MethodDescriptorsの空のリストを返すために、私のBeanInfoを編集してみました:あなたはBeanInfoで特定のメソッドからnullを返すならば、Introspectorはそのことのために低レベルのイントロスペクションを行います。デフォルトはnullです。したがってnullBeanInfo#getMethodDescriptors()から返すと、Introspectorはクラス内のすべてのパブリックメソッドを見つけ、MethodDescriptorを作成します。

とにかく、私は、私は方法としてtargetを「見て」いないにFreemarkerのを強制することができることを期待して、MethodDescriptor Sの空のリストを返しますが、Javaの豆プロパティとして(私のBeanInfoPropertyDescriptorように「通って落ちます」上記の通り)。これはうまくいかなかった。要するに

、どのように私は私の作ることができます。

someObject.target 

...呪文のアクセス私のプロパティ記述子ではなく、target()方法?

+0

['MethodAppearanceFineTuner'](http://freemarker.org/docs/api/freemarker/ext/beans/MethodAppearanceFineTuner.html)クラスが私をここで助けてくれるようです。 –

答えて

1

FreeMarkerはjava.beans.Introspectorを使用してBeanのプロパティとアクションを検出するため、BeanInfoのコンテンツを使用します。問題が発生した場合は、PropertyDescriptor -sとMethodDescriptor-sの名前が重複して返されます。テンプレート言語はプロパティとメソッドのための別個の名前空間を持たないため、他のものを影付けする必要があります。デフォルトでは、メソッドのシャドウプロパティ(現状では実用的ではありませんが、流暢なAPIはFoo getFoo()ではなくFoo foo()のようなメソッドを持つことが多いため)。 のmethodAppearanceFineTunerプロパティをdecision.setMethodShadowsProperty(false)というだけのMethodAppearanceFineTurnerオブジェクトに設定すると、これを変更できます。

+0

ありがとうございます。はい;正確に正しい。 –

関連する問題