我正在为SelectManyCheckBox获取“Value is not valid option”

时间:2012-04-28 07:12:20

标签: java jsf

我在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

2 个答案:

答案 0 :(得分: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,这是您selectedCheckboxes的声明,而是equals()不同的类型或自定义类型getObjectID() 1}}没有实现或破坏。


根据您的评论

更新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">

并且可能(不确定,现在无法从头顶分辨)也明确提供转换器:

{{1}}

答案 1 :(得分: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;
   }