在XPages中动态设置和获取bean属性

问题描述:

另一个Java问题(我是一个noob,我知道):是否可以在Java Bean中使用动态属性getter的自定义控件中的动态属性绑定?在XPages中动态设置和获取bean属性

我会解释一下。我在自定义控件中广泛使用此功能:

  <xp:inputTextarea id="DF_TiersM"> 
       <xp:this.value><![CDATA[#{compositeData.dataSource[compositeData.fieldName]}]]></xp:this.value> 

这用于数据源和字段名称均作为参数传递的控件中。这工作,迄今为止很好。 现在,在某些情况下,数据源是一个托管bean。当上面的行被解释时,显然代码被生成来获取或设置...的值。但究竟是什么?

我得到这个错误:正从类型的豆com.sjef.AnyRecord我的猜测是正确的,因为没有公共getSomeField()在我的bean属性“SomeField” 错误。所有属性都是在bean中动态定义的。

那么如何让XPages读取属性?是否有一个通用的getter(和setter),允许我使用属性的名称作为参数,而不是包含在固定的方法名称中?如果XPages没有找到getSomeField(),它会尝试其他的东西,例如,只是得到(字符串名称)左右?

一如既往:我真的很感谢您的帮助和解答!

绑定的工作方式取决于您的Java对象是否实现受支持的接口。如果它不是(如果它只是一些随机的Java对象),那么任何属性都被视为“bean风格”名称,所以如果你想调用“.getSomeField()”,那么绑定就像“ #{obj.someField}“(或”#{obj ['someField']}“,等等)。

如果你希望它回落到一个常用的方法,这对无论是DataObjectMap接口一份工作 - Map较大实现,但更标准的(你可以从AbstractMap如果适用继承),而DataObject基本上是一个XPages主题,但我是一个很大的粉丝(作为参考,文档数据源是DataObject s)。不过要注意的是:如果你实现其中一个,EL将只有绑定到getgetValue方法,并且会忽略正常的setter和getter。如果你想使用这些,你必须编写反射代码来实现这一点(我推荐使用Apache BeanUtils)。

我有我的博客上描述得更详细些帖子:https://frostillic.us/f.nsf/posts/expanding-your-use-of-el-%28part-1%29

+0

大家好,非常感谢!我真的不希望XPages调用“.getSomeField()”,而是需要“.get('SomeField')”左右。我使用多种数据源的动态自定义控件,其中一个恰好是一个bean。这个bean应该能够在编译时支持名字未知的属性... – 2014-10-28 17:56:53

+0

是的,那么'Map'或'DataObject'就是你想要的。下面是一个'DataObject'的例子,它从翻译包中获取它的数据(但它可能在任何地方):https://frostillic.us/blog/posts/FE0AE00B7CEC4F8885257D46006CAB68 – 2014-10-28 18:00:44

+0

非常好!我从来没有找到DataObject类。感谢这个例子! – 2014-10-28 23:24:39