【发布时间】:2017-05-16 07:10:44
【问题描述】:
我正在尝试按照他们的documentation 为 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
更新 只要有公共 getter,JavaScript 似乎就可以用于私有字段。
【问题讨论】:
标签: javascript java validation groovy oval