2017-05-16 19 views
0

私は、documentationに続いてOValのアクティベーションルールを実装しようとしていますが、という問題が発生しているようですが、変数が見つかりました。残念なことに、ドキュメンテーションの小さなセクション以外には、そのトピックに関するオンラインはあまりありません。制約のためのOValアクティベーションルールは動作しません

私が解決しようとしている問題の他の部分も@Guardedアノテーションを使ってコンストラクタ検証のため、この作業を取得することです。 this questionに私の答えで説明したように、これは制約ルールなしで正常に動作しますが、私はどちらかJavaScriptのまたはGroovyので活性化ルールを追加していないとき。

3.4。制約

public class BusinessObject 
{ 
    private String fieldA; 

    @NotNull(when = "groovy:_this.fieldA != null") 
    private String fieldB; 
} 

の活性化のルールを宣言私はJSとGroovyの両方を試してと_thisずに試してみました。だから私は、彼らがドキュメントに一覧表示方法が正しいですが、私は何かが欠けてると仮定しReferenceError: "someString" is not defined:それを削除することになります。コンストラクタの検証のための

public class BusinessObject { 
    private String fieldA; 

    //@NotNull(when = "groovy:_this.fieldA != null") //works for public & private 
    @NotNull(when = "javascript:_this.fieldA != null") //only works when fieldA is public 
    private String fieldB; 

    public BusinessObject(){} 

    public BusinessObject(String fieldA, String fieldB) { 
     this.fieldA = fieldA; 
     this.fieldB = fieldB; 
    } 
} 

コード:

フィールド検証のためのコードに

私は、オブジェクトをテストしていますどのように
@Guarded 
public class BusinessObjectConstructorValidation { 
    private String fieldA; 
    private String fieldB; 

    public BusinessObjectConstructorValidation(
      String fieldA, 
      @NotNull(when = "groovy:_this.fieldA != null") String fieldB) { 

     this.fieldA = fieldA; 
     this.fieldB = fieldB; 
    } 
} 

public class BusinessObjectTest { 

    @Test 
    public void fieldANullFieldBNotValidatedNoViolations() { 
     BusinessObject businessObject = new BusinessObject(null, null); 
     Validator validator = new Validator(); 
     validator.validate(businessObject); 
    } 

    //This test will fail if the fields are private and using javascript 
    //If it's public or using groovy it passes 
    @Test 
    public void fieldANotNullFieldBValidatedViolationsSizeIsOne() { 
     BusinessObject businessObject = new BusinessObject("A", null); 
     Validator validator = new Validator(); 
     List<ConstraintViolation> errors = validator.validate(businessObject); 
     System.out.println(errors.size()); 
     assertThat(errors.size(), is(1)); 
    } 

    @Test 
    public void fieldANullFieldBNotNullNoViolations() { 
     BusinessObject businessObject = new BusinessObject(null, "B"); 
     Validator validator = new Validator(); 
     validator.validate(businessObject); 
    } 
} 

私がなぜわからないんだけどJavaScriptのバージョンはgroovyのものとは異なって動作しますが、私が考えることができるすべての組み合わせを変更しようとしました:_this.fieldA__this.fieldAwindow.fieldAfieldA__fieldA

UPDATE JavaScriptがいる限り、それは公共のゲッターを持っているとして、民間分野のために働くようです。

答えて

0

私は、次の操作を実行し、developerによって示唆されているようにはJavaScriptの代わりにGroovyのために切り替えることによって、問題を解決してきました。

のJavaScriptエンジンRhinoは直接プライベートフィールドにアクセスすることはできません。例えば。 "javascript:_this.myPrivateField!= null & & _this.myPrivateField.length> 10"は、プライベートフィールドの値にかかわらず常にfalseを返します。 Rhinoはプライベートフィールドにアクセスできない場合、例外を発生させません。

私はあなたの代わりに制約の活性化のためのjavascriptのグルーヴィー使用することをお勧めします。 ほとんどのスクリプトランタイム(JavaScriptを含む)では、_this.someVariableステートメントは_this.getSomeVariable()ゲッターを呼び出し、同じ名前のプライベートフィールドに直接アクセスすることはありません。私のコード例の最初の行で

(checkInvariants = false)が必要とされますが、検証しているオブジェクトは、任意のパブリックgetterメソッドを持っている場合、それ以外の場合には、残念ながら、私のようにコンストラクタで検証を加えることStackOverflowError

になります私の質問に掲載されて動作しません。だから私はフィールドに検証を追加し、@PostValidateThisアノテーションをコンストラクタに追加する必要があった。

例コンストラクタの呼び出し後に検証を使用するPojo。

@Guarded(checkInvariants = false)// removing this results in StackOverflowError 
public class User { 
    private final String firstName; 
    private final String lastName; 
    @NotNull(when = "groovy:_this.lastName != null") 
    private final Integer age; 

    @PostValidateThis 
    public User(String firstName, String lastName, Integer age) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.age = age; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public Integer getAge() { 
     return age; 
    } 
} 

上記pojoの基本単位テスト。

public class UserTest { 
    @Test 
    public void userValidParamsNoException() throws Exception { 
     User user = new User("foo","bar",123); 
     assertThat(user, is(not(nullValue()))); 
     assertThat(user.getFirstName(), is("foo")); 
     assertThat(user.getLastName(), is("bar")); 
     assertThat(user.getAge(), is(123)); 
    } 

    @Test 
    public void userLastNameNullNoException() throws Exception { 
     User user = new User("foo",null, null); 
     assertThat(user, is(not(nullValue()))); 
     assertThat(user.getFirstName(), is("foo")); 
    } 

    @Test(expected = ConstraintsViolatedException.class) 
    public void userLastNameNotNullAgeNullThrowsException() throws Exception { 
     User user = new User("foo","bar", null); 
    } 
} 
関連する問題