0

JSFプロジェクトでBeanValidationを使用しています。前のメソッドが検証された場合にのみメソッドを検証したいという状況に遭遇しました。

例を挙げましょう:

@AssertTrue(message="{invalidCode}")
private boolean isValidActivationCode() { ... }

if(isValidActivationCode()) {
    @AssertTrue(message="{alreadyActivated}")
    private boolean isAlreadyActivated() { ... }
}

パラメータごとにアクティベーションコードを受け取るので、最初に検証したいと思います。無効な場合は違反となります。もしそうなら、私はそれがすでにアクティブ化されているかどうかさえ確認できません(コードが無効であるため)。それで、上記のようなことを達成することは可能ですか(ifステートメントの機能、これはうまくいかないことを私は知っていますが、それは私が達成しようとしていることを示しています)。

前もって感謝します

アップデート

Ravi Kが述べたような回避策:

@AssertTrue(message="{invalidCode}")
private boolean isValidActivationCode() { ... }

@AssertTrue(message="{alreadyActivated}")
private boolean isAlreadyActivated() { return isValidActivationCode() ? ... : true; }

疑問に思いますが、これを解決するためのクリーンな方法はありますか?すぐに誰も答えを出さない場合は、これに対する明確な解決策はないと想定し、この問題の答えとしてRaviKからの回避策を受け入れます。

4

2 に答える 2

2

あなたが言ったように、回避策が良くないと感じるなら、2つの選択肢があります。

1)上記と同じ回避策を実行しますが、もう少し論理的にします。isAlreadyActivated()の戻りタイプをブール値ではなくブール値に変更します。isAlreadyActivated()メソッドで、isValidActivationCode()がfalseの場合、nullを返します。

http://docs.oracle.com/javaee/6/api/index.html?javax/validation/constraints/package-summary.html

上記のAPIに従って、nullは有効と見なされます。したがって、ロジックがより明確になります。true =有効、false =無効、null=該当なし。そのメソッドのjavadocにも同じものを入れることができます。

 @AssertTrue(message="{invalidCode}")
    private boolean isValidActivationCode() { ... }


    @AssertTrue(message="{alreadyActivated}")
    private Boolean isAlreadyActivated() {

         if(isValidActivationCode()) {
               <Logic for isAlreadyActivated>
          } else {
             return null;
           }

    }

2)カスタム制約に進みます。@AssertTrueは制約に組み込まれており、jsfの人は彼らが十分ではないことを知っています。だから彼らはあなた自身を作成する特権を与えました。だから、そのために行きます。同じことについては、以下のリンクを参照してください。

http://docs.jboss.org/hibernate/validator/4.0.1/reference/en/html/validator-customconstraints.html

JSR 303検証、1つのフィールドが「何か」に等しい場合、これらの他のフィールドはnullであってはなりません

私たちが得たのはそれだけだと思います、選択はあなた次第です:)

于 2012-10-23T05:50:40.437 に答える
1

JSFアノテーションの側面についてはあまり詳しく説明できませんでしたが、isAlreadyActivated()でisValidActivationCode()を単純に呼び出すことができないのはなぜですか?

@AssertTrue(message="{invalidCode}")
private boolean isValidActivationCode() { ... }


@AssertTrue(message="{alreadyActivated}")
private boolean isAlreadyActivated() {

     if(isValidActivationCode()) {
           <Logic for isAlreadyActivated>
      )

}
于 2012-10-22T13:22:54.690 に答える