簡體   English   中英

JSF無法從h:dataTable中的支持bean解析轉換器ID

[英]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} )更改為具有完全有價值的ConverterValidator屬性(您可以在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM