4

次のような住所エンティティがあります。

@Entity
public class Address implements java.io.Serializable {
    @Id @GeneratedValue(strategy = IDENTITY)
    private Long id;

    @Size(max = 100)
    private String street;

    @Size(max = 15)
    private String nr;

    @Field
    @Size(min = 1, max = 20) @NotBlank
    private String city;
}

これは、他のいくつかのエンティティの一部です。そのようなエンティティの 1 つでは、アドレスはオプションです。ユーザーがいくつかの住所フィールドを含むいくつかのフォーム入力を介してエンティティ全体を編集できるビューがあります。

住所を編集できるようにするために、親エンティティを空の住所エンティティで初期化します。

Address問題は次のとおりです。すべてのアドレス フィールドが空の場合、エンティティに を保持したくありません。それが機能するには、エンティティのすべてのフィールドAddressが空の場合 (およびその場合にのみ)、エンティティの検証をスキップする必要があります。最もエレガントな方法でそれを行うにはどうすればよいですか?

私が現在行っているのは、送信ボタンの Bean 検証を完全にスキップし、空の場合<o:validateBean disabled="true" />はアドレスを設定することです。しかし、これはあらゆる場合にすべての検証をnull無効にするため、完全なハックのように聞こえます。どうすればもっとうまくやれるでしょうか?

4

2 に答える 2

6

(and )disabledの属性でEL を使用できます。EL を使用して、これらのフィールドのいずれかが入力されているかどうかを確認できます。属性を使用して、EL 内のコンポーネントを参照できます。コンポーネントのクライアント ID に関連付けられた要求パラメーターの値を確認することで、フィールドが入力されているかどうかを確認できます。<f:validateBean><o:validateBean>binding

次に、#{addressIsEmpty}evaluates時にこれらのフィールドで Bean 検証を無効にするには、複数の入力コンポーネントをラップするために前者を使用できるため、代わりにtrue使用する方が簡単です。<f:validateBean><o:validateBean>

したがって、すべての場合、これは次のようにする必要があります。

<c:set var="addressIsEmpty" value="#{empty param[street.clientId] and empty param[nr.clientId] and empty param[city.clientId]}" />

<f:validateBean disabled="#{addressIsEmpty}">
    <h:inputText binding="#{street}" value="#{bean.address.street}" />
    <h:inputText binding="#{nr}" value="#{bean.address.nr}" />
    <h:inputText binding="#{city}" value="#{bean.address.city}" />
</f:validateBean>

<o:validateBean>、入力ごとまたはコマンドごとに制御する場合にのみ使いやすくなります。

于 2013-07-06T13:50:44.997 に答える