0

次のコードを使用してTest、(私のドメインからの)タイプの要素のコレクションをリストします。rich:select

test.xtml

<rich:select value="#{testBean.test}" id="cmbTest"
    converter="#{testConverter}" enableManualInput="false">
    <f:selectItems value="#{testBean.all}" var="test" itemLabel="#{test.name}" />
</rich:select>
<rich:message for="cmbTest" />
<h:commandButton id="btnSave" action="#{testBean.save}" value="Save" />

Testまた、選択した文字列値をタイプのオブジェクトに変換したり、その逆を行ったりするためのカスタムjsf-converterもあります。

TestConverter.java

@Component
@Scope("request")
public class TestConverter implements Converter {
    @Override
    public Object getAsObject(FacesContext facescontext, UIComponent uicomponent, String value) {
        if (value == null) return null;
        return new Test(Integer.parseInt(value), "test" + value);
    }

    @Override
    public String getAsString(FacesContext facescontext, UIComponent uicomponent, Object obj) {
        if (obj == null) return null;
        return ((Test) obj).getId().toString();
    }
}

(お気づきかもしれませんが、私はSpringを使用しています)xhtmlファイルのbacking-beanは次のように定義されています。

TestBean.java

@Controller("testBean")
@Scope("session")
public class TestBean {
    private Test test;
    private List<Test> all; 

    public TestBean() {
        all = new ArrayList<Test>();
        for (int i = 0; i < 15; i++) { 
            all.add(new Test(1, String.format("test%d", i)));    
        }
    }

    public Test getTest() {
        return test;
    }

    public void save() {
        System.out.println("Save");
    }

    public List<Test> getAll() {
        return all;
    }
}

有効なアイテムを選択した後で[保存]ボタンを押すと、以下に示すように、「値は有効なオプションではありません」という検証エラーが発生します。

ここに画像の説明を入力してください

ConvertergetAsObject呼び出しをデバッグしましたが、正常に動作し、Test期待どおりに有効なインスタンスが返されます(実際、この「テスト」プロジェクトは、この問題を最初に見つけた作業プロジェクトの分離されたケースであり、そのプロジェクトでは、コンバーターは正常に使用します。データベースからオブジェクトを取得するために挿入されたサービス)。

save明らかに、このエラーでビューがjsf検証フェーズでスタックするため、Beanメソッドが呼び出されることはありません。

に置き換えようとしましrich:selecth:selectOneMenuが、同じです。私は多くのjsf-converterチュートリアル/docs/ refsをサーフィンしましたが、何が間違っているのかまだわかりません。

私はここで指摘されているようにmavenとRichfacesBOM構成を使用していますが、バージョンを4.2.2.Finalに置き換えました(更新によって修正されることを期待しています)

ここにテストプロジェクトを投稿しました

どんな助けでも本当にありがたいです、私はこれの解決策を見つけるために多くの時間を費やしました、多分単純な/愚かな何かですが、私はただデバッグ/検索にうんざりしています

4

1 に答える 1

2

JSFがアイテムのリストで選択および変換されたアイテムを見つけることができるように、クラスequals()hashCode()に実装する必要があります。Test変換後、JSFは選択されたアイテムをリスト内のアイテムと比較し、見つからない場合はこのエラーを発生させます。

于 2012-10-19T13:36:37.570 に答える