【问题标题】:Omnifaces - ListIndexConverter, principle of operationOmnifaces - ListIndexConverter,操作原理
【发布时间】:2023-12-12 02:41:02
【问题描述】:

我试着去理解 omnifaces.converter.ListIndexConverter

@FacesConverter("omnifaces.ListIndexConverter")
public class ListIndexConverter implements Converter {

private static final String ERROR_LIST_INDEX_BOUNDS =
        "Index {0} for value {1} in component {2} is out of bounds.";

private static final String ERROR_VALUE_NOT_IN_LIST =
        "Object {0} in component {1} does not appear to be present in the given list.";

private List<?> list;

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
    int index = Integer.valueOf(value);
    if (index < 0 || index >= list.size()) {
        throw new ConverterException(
            createError(ERROR_LIST_INDEX_BOUNDS, index, value, component.getClientId(context))
        );
    }

    return list.get(index);
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
    for (int i = 0; i < list.size(); i++) {
        if (list.get(i).equals(value)) {
            return i + "";
        }
    }

    throw new ConverterException(
        createError(ERROR_VALUE_NOT_IN_LIST, value == null ? "null" : value.toString(), component.getClientId(context))
    );
}

public void setList(List<?> list) {
    this.list = list;
}

}

我已经对其进行了调试,但无法弄清楚所有内容!

这是我的问题:

1) list 成员变量何时由谁填充?

2) 在文档中

http://omnifaces.org/docs/javadoc/2.0/org/omnifaces/converter/SelectItemsIndexConverter.html

提到以下几点:

这个转换器比 SelectItemsConverter 有以下缺点:

由于开发人员的错误,在回发期间可用的选择项发生不兼容更改的情况下,将不再出现“验证错误:值无效”。开发人员应绝对确保在回发时保留完全相同的列表(例如,通过使其成为视图范围或更广泛范围 bean 的属性)。

SelectItemsConverter可以替换为ListConverter

有人可以更详细地解释一下吗? 据我了解,它需要一个@RequestScoped Bean 和一个用于DataTable 的可编辑列表来引发这个? 出于教育原因,我想这样做,并将其展示给其他开发人员。

希望我的问题很清楚!非常感谢您的任何解释!

【问题讨论】:

    标签: jsf converter omnifaces


    【解决方案1】:

    列表成员变量何时由谁填充?

    通过&lt;o:converter list&gt; 属性,完全如展示中的Usage 部分所示。

    <p:pickList value="#{bean.dualListModel}" var="entity" itemValue="#{entity}" itemLabel="#{entity.someProperty}">
        <o:converter converterId="omnifaces.ListIndexConverter" list="#{bean.dualListModel.source}" />
        <!-- ===================================================^^^^ -->
    </p:pickList>
    

    &lt;o:converter&gt; 是一个特殊的标记处理程序,它允许在引用的Converter 实例上设置任意属性,就好像它是 bean 属性一样。


    “验证错误:值无效”将不再发生 [...]

    有人能详细解释一下吗?

    所选项目的omnifaces.XxxIndexConverter 不再由它们自己的标识符标识,而是由它们在列表中的位置标识。如果列表在回发中发生变化,JSF 可以通过这种方式不再验证所选项目是否真的 是列表的一部分并且最终用户真的 打算准确选择该项目。想象一下,由于项目被删除或在所选项目之前添加了新项目,该项目在列表中的位置发生了变化,那么您最终会得到错误的项目。有关背景说明,另请参阅Validation Error: Value is not valid 上的答案。

    如果这是一个安全问题,那么您最好选择omnifaces.XxxConverter(不带Index)。

    【讨论】: