我正在尝试将自定义类对象与 MyFaces UI 组件(如复选框/组合等)绑定在一起,但没有通过在支持中创建 getter/setter 来提供像 int/float/boolean/String/List<String> 这样的显式类型豆。
所以在我的情况下,它通常看起来像这样:
<h:selectOneListbox id="mylist" value="#{bean.myListValueHolder.data}"
converter="myValueConverter">
...
</h:selectOneListbox>
在哪里:
- bean 是支持 bean
- myListValueHolder 的类型为 MyValueHolder<T>
- 数据类型为 <T>
我正在尝试为其使用自定义转换器和此类签名:
public class MyValueHolder<T extends Comparable<T>> extends Node<T> {
....
MyValueHolder 有这个方法:
public T getData() {
...
public void setData(Object data) {
...
public void setData(T data) {
...
我的转换器:
public Object getAsObject(FacesContext fc, UIComponent c, String value) {
...
问题:如何找出在运行时作为值传递的类型<T>?在我的例子中,它可以是布尔值、int、float、double、String 或 List<String>。
但我有点不喜欢写
- 很多“尝试转换为一个类型,如果它成功,它就是你的类型”,但不确定它是 int 还是 float/double。
- 在我定义我的 h:selectOneListbox 时将类型作为参数或作为第二个参数
- ???
我怎样才能做到这一点?
编辑:好的,列表不起作用。但问题是,在我看来,将 JSF UIComponents 中的值绑定到某种值包装器以避免在我的支持 bean 中写入许多简单的“虚拟”getter/setter 是否有好处?
所以我可以使用“一个”bean,它可以通过键(属性名称是一个字符串)访问 MyValueHolder,如“bean.get('property_name')”或“#{bean.myListValueHolder.data}”或类似的语法?
EDIT2:回答 BalusC 问题并解释原因。
至于现在,我不确定这种方法是否好。
我的数据以 XML 形式出现,我对其进行解析以将其另存为key
,value
对。我的 UI 元素也有一个特定state
的(s)(来自State
-Enum {hidden, visible, disabled, enabled, hover, focus, active, ...} 的 EnumSet,它依赖于存储在中的特定值ValueHolders
。所需的依赖项State
( s)在一个类中描述,该类Rule
具有一个EnumSet
ofState
和一个matches
方法,true
如果定义State
应被应用,则返回,因为Rule
匹配。与该匹配相关的。ValueChangedListeners
State
Value
Rules
Value
至少我是这么想的,我可以做到。所以我可以从我的视图中查询值和 ui-state,如果一些具体的值发生变化,这反过来可能会改变State
我UIComponent
可以调用回调并取决于新的State
添加/删除一个新的 css 类到该特定组件通过查询。
好吧,听起来有点复杂或有点矫枉过正,但我想States
用 Java 定义我的 UI 组件,所以我也可以State
从 Java 更改它,而不是在视图中定义状态规则。