0

我的 JSP 页面中有这段代码:

<h:selectManyCheckbox id="chb" value="#{MyBean.selectedCheckBoxes}" layout="pageDirection">
     <f:selectItems value="#{MyBean.checkBoxItems}"/>
</h:selectManyCheckbox>

在我的 MyBean 中:

public class MyBean {

    public MyBean() {
        for (Elem section : sections) {
            checkBoxItems.put(section.getName(), section.getObjectID());
        }
    }

    private String[] selectedCheckBoxes;
    private Map<String, Object> checkBoxItems = new LinkedHashMap<String, Object>();

    public String save() {
        //save is not being executed....
        return FORWARD;
    }

    public Map<String, Object> getCheckBoxItems() {
        return checkBoxItems;
    }

    public void setCheckBoxItems(Map<String, Object> checkBoxItems) {
        this.checkBoxItems = checkBoxItems;
    }

    public String[] getSelectedCheckBoxes() {
        return selectedCheckBoxes;
    }

    public void setSelectedCheckBoxes(String[] selectedCheckBoxes) {
        this.selectedCheckBoxes = selectedCheckBoxes;
    }
}

当我单击保存时,它会在<t:message for="chb"/>

“chb”:值不是有效选项。

即使我没有为 添加required属性h:selectManyCheckbox,它也在尝试验证或执行其他操作...我已将checkBoxItems 变量类型(使用 getter/setter)更改为List<SelectItem>,但它无法正常工作。可能是什么原因,我该如何解决?
PS:我正在使用 JSF 1.1

4

2 回答 2

3

equals()当对所选项目的测试返回任何可用项目时true,您将收到此错误。因此,当在 JSF 的掩护下大致发生以下情况时:

boolean valid = false;

for (Object availableItem : availableItems) {
    if (selectedItem.equals(availableItem)) {
        valid = true;
        break;
    }
}

if (!valid) {
    // Validation error: Value is not valid!
}

在您的特定情况下,这仅意味着section.getObjectID()不返回String您声明的 a ,而是未实现或破坏selectedCheckboxes的不同类型或自定义类型。equals()


根据您的评论更新getObjectID(),返回Integer。因此它被视为String因为selectedCheckBoxes被声明为String[]. 您应该更改以下内容

private String[] selectedCheckBoxes;
private Map<String, Object> checkBoxItems = new LinkedHashMap<String, Object>();

private Integer[] selectedCheckBoxes;
private Map<String, Integer> checkBoxItems = new LinkedHashMap<String, Integer>();

也许(不确定,现在不能从头顶上分辨出来)还明确提供了一个转换器:

<h:selectManyCheckbox ... converter="javax.faces.Integer">
于 2012-04-28T12:16:26.213 回答
0

我在代码中没有发现任何问题,我认为您传递给 oneManyCheckBox 的列表存在问题。

在 getter 中硬编码列表中的一些值而不是检查

  public Map<String, Object> getCheckBoxItems() {

    checkBoxItems.clear();
    checkBoxItems.put("aaaa", "aaaa");
    checkBoxItems.put("bbbb", "bbbb");
    checkBoxItems.put("cccc", "cccc");
    checkBoxItems.put("dddd", "dddd");
    checkBoxItems.put("eeee", "eeee");

    return checkBoxItems;
   }
于 2012-04-28T11:48:57.017 回答