【问题标题】:I'm getting "Value is not a valid option" for SelectManyCheckBox我收到 SelectManyCheckBox 的“值不是有效选项”
【发布时间】:2012-04-28 07:12:20
【问题描述】:

我的 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;
    }
}

当我点击保存时,它会在&lt;t:message for="chb"/&gt; 中显示以下消息

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

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

【问题讨论】:

    标签: java jsf


    【解决方案1】:

    当对选定项目的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() 返回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">
    

    【讨论】:

    • 谢谢 Bauke 先生。就我而言,section.getObjectID() 返回Integer。我是否应该使用可以实现 equals().... 的自定义类型。但是仍然是相同的消息...
    • 不,Integer 很好。你应该只提供一个转换器。我会更新答案。
    【解决方案2】:

    我没有在代码中发现任何问题,我认为您传递给 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;
       }
    

    【讨论】:

    • 谢谢!所有复选框都在 UI 中呈现,并且值正在正确传递给checkBoxItems....
    猜你喜欢
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 2015-07-25
    • 2019-12-18
    • 2011-05-20
    相关资源
    最近更新 更多