另一个Java问题(我知道这是一个菜鸟):是否可以在自定义控件中使用动态属性绑定和Java bean中的动态属性getter?
我会解释。我在自定义控件中广泛使用此功能:
<xp:inputTextarea id="DF_TiersM">
<xp:this.value><![CDATA[#{compositeData.dataSource[compositeData.fieldName]}]]></xp:this.value>
这用于控件,其中数据源和字段名称都作为参数传递。到目前为止这很好用。 现在,在某些情况下,数据源是托管bean。当解释上述行时,显然生成代码以获取或设置......某事物的值。但具体到底是什么?
我收到此错误:错误获取属性&#39; SomeField&#39;来自类型为com.sjef.AnyRecord 的bean,我认为这是正确的,因为我的bean中没有公共的getSomeField()。所有属性都在bean中动态定义。
那么如何让XPage读取属性呢?是否有一个通用的getter(和setter)允许我使用属性的名称作为参数而不是包含在固定的方法名称中?如果XPages没有找到getSomeField(),它会尝试其他方式,例如刚刚得到(字符串名称)左右?
一如既往:非常感谢您的帮助和解答!
答案 0 :(得分:2)
绑定的工作方式取决于Java对象是否实现了受支持的接口。如果它没有(如果它只是一些随机的Java对象),那么任何属性都被视为&#34; bean-style&#34;名称,这样,如果你想调用&#34; .getSomeField()&#34;,那么绑定就像&#34;#{obj.someField}&#34; (或&#34;#{obj [&#39; someField&#39;]}&#34;等等。)
如果您希望它回归到一个常用方法,那么DataObject
或Map
接口的作业 - Map
实现的规模要大一些,但更多标准(如果适用,您可以继承AbstractMap
),而DataObject
基本上是XPages-ism,但我是其中的忠实粉丝(供参考,文档数据源为{{1} } S)。但请注意:如果您实现其中之一,EL将仅绑定到DataObject
或get
方法,并忽略普通的setter和getter。如果你想使用那些,你必须编写反射代码来做到这一点(我建议使用Apache BeanUtils)。
我的博客上有一篇更详细的帖子:https://frostillic.us/f.nsf/posts/expanding-your-use-of-el-%28part-1%29