2012-04-28 57 views
0

我在JSP页面中有这样的代码:我越来越“值不是一个有效的选择”为SelectManyCheckBox

<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”:值不是有效的选项。

即使我没有为h:selectManyCheckbox添加required属性,它正试图验证或做别的事情...... 我已经改变了checkBoxItems可变型(带的getter/setter方法)来List<SelectItem>,但它不是很好。 可能是什么原因,我该如何解决?
PS:我正在使用JSF 1.1

回答

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()回报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"> 
+0

谢谢Mr. Bauke。在我的案例中'section.getObjectID()'返回'Integer'。我应该使用自定义类型来实现'equals()'....我将代码更改为Java端:http://pastebin.com/jxnFGDQZ,这是我的JSP文件http:/ /pastebin.com/7T2yzP55。不过,仍然是相同的消息... – 2012-04-28 13:36:24

+0

不,“整数”是好的。你应该只提供一个转换器。我会更新答案。 – BalusC 2012-04-28 13:42:52

+0

非常感谢先生...你太棒了!!! – 2012-04-28 13:55:49

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; 
    } 
+0

谢谢!所有复选框都在UI中呈现,值正在传递给'checkBoxItems' .... – 2012-04-28 12:00:07