我在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
答案 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;
}