Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Freemarker是否尊重方法描述符?_Java_Javabeans_Freemarker - Fatal编程技术网

Java Freemarker是否尊重方法描述符?

Java Freemarker是否尊重方法描述符?,java,javabeans,freemarker,Java,Javabeans,Freemarker,背景:我已经断断续续地使用JavaBeans大约18年了;我已经和Freemarker合作一两周了- 我有一个手工制作的BeanInfo,它表示一个类的属性,该类不遵循普通但明显任意的get/set方法命名风格 从语义上讲,对于名为x的javabean属性,您可以在这个类上调用名为x的方法 因此,Freemarker正在查找和加载的BeanInfo实现实现了这个模式。好的 这个类实际上有一个名为target的方法,它返回一个特定的对象,我们在这里称它为target,它由一个名为target的Pr

背景:我已经断断续续地使用JavaBeans大约18年了;我已经和Freemarker合作一两周了-

我有一个手工制作的BeanInfo,它表示一个类的属性,该类不遵循普通但明显任意的get/set方法命名风格

从语义上讲,对于名为x的javabean属性,您可以在这个类上调用名为x的方法

因此,Freemarker正在查找和加载的BeanInfo实现实现了这个模式。好的

这个类实际上有一个名为target的方法,它返回一个特定的对象,我们在这里称它为target,它由一个名为target的PropertyDescriptor表示,其readMethod就是这个方法。好的

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

theObject.target
…我得到一个错误,目标实际上是一个方法,而不是一个属性,这表明我的PropertyDescriptor虽然在技术上是可查找的,但没有被查询。如果改为:

theObject.target()
…然后一切都会好起来。换句话说,目标方法似乎被Freemarker视为一种方法,就像Freemarker没有进入PropertyDescriptor,否则它会告诉它这实际上是JavaBean属性的读取方法

我试图编辑我的BeanInfo以返回一个空的MethodDescriptor列表,我想这可能就是问题所在:如果您从BeanInfo中的某个特定方法返回null,那么内省者会对该对象进行低级内省。默认值为null。因此,如果您从BeaninfogetMethodDescriptor返回null,则Interspector可能会找到类中的所有公共方法,并为它们创建MethodDescriptor

无论如何,我返回了一个MethodDescriptor的空列表,希望我能强迫Freemarker不要将目标视为一个方法,而是将其视为一个Java beans属性,正如上面提到的那样,该属性会被我的BeanInfo的PropertyDescriptor忽略。这不管用

简言之,我如何使我的:

someObject.target
…咒语访问我的属性描述符,而不是目标方法?

因为FreeMarker使用java.beans.Introspector来发现bean属性和操作,它确实尊重BeanInfo的内容。问题是,在您的示例中,它将返回名称冲突的PropertyDescriptor-s和MethodDescriptor-s。由于模板语言没有单独的属性和方法名称空间,因此一个名称空间必须隐藏另一个名称空间。默认情况下,方法会隐藏属性,这在当今不是很实用,因为fluent API-s通常有Foo-Foo之类的方法,而不是Foo-getFoo。您可以通过将DefaultObjectWrapperBuilder的MethodAppearanceFineTunner属性设置为methodAppearanceFineTuner对象来改变这一点,该对象总是调用decision.setMethodShadowsPropertyfalse。

看起来该类确实可以在这里帮助我。