2017-03-31 146 views
0

(背景:我一直在用的Java bean工作某处大约18年和关闭;我一直在Freemarker的工作了两个星期:-))Freemarker是否支持MethodDescriptors?

我有一个手式调试BeanInfo它代表不遵循“普通”(但显然是任意的)方法命名方式的类的属性。

从语义上讲,对于名为x的Java bean属性,您可以在该类上调用一个名为x()的方法。

因此,我的BeanInfo实现(Freemarker正在查找并加载)实现此模式。精细。

有问题的类实际上有一个名为target()方法,该方法返回一个特定的对象(姑且称之为Target这里),并且通过一个PropertyDescriptor他的名字是target,其readMethod是法表示。精细。

在我Freemarker模板,如果我这样做:

theObject.target 

...我得到一个错误,指出target,是一个有效的方法,而不是一个性质,提示我PropertyDescriptor,虽然在技术上容易找到,没有被咨询。如果我将其改为:

theObject.target() 

...然后一切正常。换句话说,这个方法似乎被Freemarker视为一种方法 - 它就像Freemarker没有“通过”PropertyDescriptor,否则它会告诉它这实际上是Java bean属性的“读取方法” 。

我试图编辑我BeanInfo返回的MethodDescriptors空列表,心想也许这就是问题所在:如果你从一个特定的方法在BeanInfo返回null那么Introspector确实为那件事低水平反思。并且null是默认值。因此,如果您从BeanInfo#getMethodDescriptors()返回null,Introspector可能会找到您班级中的所有公共方法,并为他们创建MethodDescriptor

无论如何,所以我回来的MethodDescriptor秒的空单,希望我能迫使Freemarker的到不是“看” target作为一种方法,但作为一个Java bean的属性(“通过落”我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 foo()而不是Foo getFoo()的方法)。您可以通过将的methodAppearanceFineTuner属性设置为MethodAppearanceFineTurner对象来更改该对象,该对象始终称为decision.setMethodShadowsProperty(false)

+0

谢谢;是;非常正确。 –