3

私はこのSelectOneMenuを持っています:

<h:selectOneMenu value="#{orderController.requestVO.requestSituation}">
    <f:converter converterId="ComboConverter"/>
    <f:selectItems value="#{orderController.requestSituation}" var="requestSituation"
                                                   itemLabel="#{requestSituation.description}" itemValue="#{requestSituation}" />
</h:selectOneMenu>

これrequestSituationは正しく入力さArrayListRequestSituationVO ており、次の HTML が生成されます。

<select name="j_idt14:j_idt20" size="1">
        <option value="13">Pedido Recusado</option>
    <option value="11">Pedido Validado</option>
    <option value="12" selected="selected">Pedido Confirmado</option>
    <option value="12" selected="selected">Pedido Faturado</option>
</select>

私はこれを持っていConverterますが、ここで私は混乱しています。私はたくさん読んだことがあります。

ここにあります:

@FacesConverter(value = "ComboConverter", forClass = RequestSituationVO.class)
public class ComboConverter implements Converter
{

    private static RequestSituationVO requestSituationVO = new RequestSituationVO();

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value)
    {
        requestSituationVO.setId(Integer.valueOf(value));
        requestSituationVO = (RequestSituationVO) new RequestSituationBO().getRequestSituation(requestSituationVO).toArray()[0];
        return (RequestSituationVO) requestSituationVO;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value)
    {
        requestSituationVO = (RequestSituationVO) value;
        String teste = String.valueOf(requestSituationVO.getId());
        return teste;
    }
}

ページを送信すると、メソッドSelectOneMenuの値が from に自動的に設定されると思います。しかし、送信すると、私の.requestSituationrequestVOValue not validSelectOneMenu

必要なのは、選択した値を my に設定しRequestSituationVOて、ビジネス メソッドに送信できるようにすることです。

4

2 に答える 2

10

あなたのコンバーターは問題ありません。そうしないと、次のような変換エラーが発生する可能性があります

「null Converter」の変換エラー設定値「com.example.RequestSituationVO@hashcode」

検証エラーがあります。Object#equals()この特定の項目は、選択された項目のテストがリスト内の使用可能な項目のいずれにも返されなかった場合にスローされtrueます。JSF は、改ざんされたリクエストによる攻撃を防ぐためにそれをチェックしています。これには、特定のケースで次の原因が考えられます。

  • クラスのequals()メソッドRequestSituationVOが欠落しているか壊れています。
  • #{orderController.requestSituation}、フォームを表示するリクエストとフォーム送信を処理するリクエストの間で非互換に変更されました。

私は前者だと思います。あなたがオブジェクトを一意に識別するプロパティをRequestSituationVO持っているという事実を考えると、これは次のようにする必要があります。Integer id

@Override
public boolean equals(Object other) {
    return (other instanceof RequestSituationVO) && (id != null)
        ? id.equals(((RequestSituationVO) other).id)
        : (other == this);
}

@Override
public int hashCode() {
    return (id != null)
        ? (this.getClass().hashCode() + id.hashCode())
        : super.hashCode();
}

方法に問題がなければ、equals()後者の原因です。#{orderController.requestSituation}これは、フォームの表示中とフォーム送信の処理中に がまったく同じリストを返すようにすることで解決できます。これは、Bean をビュー スコープに配置し、ゲッターでビジネス ロジックをまったく実行しないことで実現できます。または、実際にアプリケーション全体のデータを表している場合は、別のアプリケーション スコープの Bean にリファクタリングできます。

こちらもご覧ください

于 2012-05-15T17:26:47.300 に答える
3

equalsにandhashCodeを実装するのを忘れていたようですRequestSituation。JSF は送信された値を指定されたすべての項目と比較するため、
これは非常に重要です。

を実装しないequalsと、送信された項目がリストに
ないと見なされ、拒否されます。( The value is not valid.)

于 2012-05-15T17:25:09.943 に答える