私は、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.fieldA
、window.fieldA
、fieldA
と__fieldA
UPDATE JavaScriptがいる限り、それは公共のゲッターを持っているとして、民間分野のために働くようです。