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 変数の型(ゲッター/セッターを使用)をList<SelectItem>に変更しましたが、うまくいきません。何が原因でしょうか、どうすれば解決できますか?
PS: JSF 1.1 を使用しています

4

2 に答える 2

3

このエラーはequals()、選択したアイテムのテストで使用可能なアイテムが返されなかった場合に発生します。そのため、おおまかに次のことが JSF の内部で発生します。true

boolean valid = false;

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

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

これは、特定のケースでは、宣言されているものをsection.getObjectID()返さないことを意味するだけですが、実装または壊れていない別のタイプまたはカスタムタイプを返します。StringselectedCheckboxesequals()


あなたのコメントに従って更新getObjectID()してくださいInteger。したがって、 として宣言されているStringため、として扱われています。以下を変更する必要がありますselectedCheckBoxesString[]

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に渡した問題があると思いました。

チェックよりもゲッターのリストのいくつかの値をハードコーディングする

  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 に答える