4

を事前選択する方法は知っています。選択済み<p:selectOneMenu>valueのオブジェクトの 1 つでなければなりませんが、<f:selectItems>このコンポーネントは内部でどのように機能し、この動作を変更できますか?

私の場合、重複したオブジェクトがあります。実際には、これは同じ値を持つ2つのオブジェクトですが、2回作成され、選択されたオブジェクトはオブジェクトとは<p:selectOneMenu>異なり、<f:selectItems>認識されません。ほとんどの場合、設計を変更して同じオブジェクトを指すようにしますが、レガシーコードなどのためにそれができない場合、たとえば<p:selectOneMenu>オブジェクトを比較する動作を変更するにはどうすればよいですか?id

それが原因だと思っていたのですが、レンダリングするとメソッドだけにconverter入らないので、何か違うのではないかと思いますが、何か?getAsObjectgetAsString

ありがとうございました

4

1 に答える 1

5

そのために使用Object#equals()します。エンティティに適宜実装することで、この動作を変更 (修正) できます。

private Long id;

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

equals-hashCode 契約hashCode()を満たすことを忘れないでください。

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

不明な理由で既存のエンティティを変更できない場合は、独自の DTO でラップします。

Stringコンバーターは、HTML 出力および HTTP 要求パラメーターで使用するために、エンティティーとその固有表現の間でのみ変換を行うため、事前選択には影響しません。潜在的なValidation Error: Value is not validのトラブルにのみ影響します。

以下も参照してください。

于 2015-04-29T13:29:00.897 に答える