[英]JSF Can't resolve Converter ID from backing bean in an h:dataTable
我在JSF中有一個動態數據表,其中包含多個輸入元素,這些輸入元素可以是各種數據類型。 輸入始終是文本控件,但可以包含數字或文本數據。 為了處理此問題,每個字段都從后備Bean檢索其converterId:
<h:dataTable id="indexFieldTable" value="#{indexFieldBean.indexField}" var="item">
<h:column id="column">
<h:inputText id="inputID" value="#{item.value}">
<f:converter id="ifConverter" converterId="#{item.converter}" />
<f:validator id="ifValidator" validatorId="#{item.validator}" />
</h:inputText>
</h:column>
</h:dataTable>
但是,呈現此錯誤時,出現以下錯誤: Expression Error: Named Object: ' not found.
如果我將converterId硬編碼為已知值,則可以正常工作:
<f:converter id="ifConverter" converterId="stringConverter" />
如何動態配置converterId?
f:
標記特定於組件,而不特定於迭代項。 在視圖構建時(當將組件填充到視圖的組件樹中時), #{item}
不可用。 僅在渲染期間可用。 您確實需要將其值附加到父bean,而不是附加到迭代項。
要解決此問題,請首先將Field
類(由#{item}
)更改為具有完全有價值的Converter
和Validator
屬性(您可以在Field
的構造中創建它們)。
public class Field {
private Converter converter;
private Validator validator;
// ...
}
然后更改Bean,以將這些字段的集合包裝在DataModel
並具有通用的convert / validate方法,這些方法委派給DataModel
當前迭代的項,該方法可通過DataModel#getRowData()
:
public class Bean {
private List<Field> fields;
private DataModel<Field> fieldModel;
public Bean() {
fields = loadItSomehow();
fieldModel = new ListDataModel<Field>(fields);
}
public Converter getFieldConverter() {
return fieldModel.getRowData().getConverter();
}
public void validateField(FacesContext context, UIComponent component, Object value) throws ValidatorException {
fieldModel.getRowData().getValidator().validate(context, component, value);
}
// ...
}
最后,按如下所示更改視圖中的輸入字段,以將h:dataTable
的值綁定到DataModel
,並將轉換器/驗證器綁定到父bean的值,后者再將調用委派給當前迭代的項:
<h:dataTable value="#{bean.fieldModel}" var="field">
<h:column>
<h:inputText value="#{field.value}" converter="#{bean.fieldConverter}" validator="#{bean.validateField}" />
...
應該指出的是,這種復雜性不是由於JSF的性質,而是由於您那里非常具體的功能要求。 通常, h:dataTable
將用於表示表格數據,而不是生成動態表格。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.