当前位置: 首页 > 知识库问答 >
问题:

约束不起作用的椭圆激活规则

勾向文
2023-03-14
public class BusinessObject
{
    private String fieldA;

    @NotNull(when = "groovy:_this.fieldA != null")
    private String fieldB;
}
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__this.fieldaWindow.fielda__fielda__fielda

共有1个答案

夹谷志
2023-03-14

我通过执行以下操作解决了这个问题,并按照开发人员的建议切换到groovy而不是JavaScript。

JavaScript引擎Rhino不能直接访问私有字段。例如。类似“JavaScript:_this.MyPrivateField!=null&&_this.MyPrivateField.length>10”的内容将始终返回false,而不管私有字段的值如何。如果Rhino不能访问私有字段,它显然不会引发异常。

我建议您使用groovy而不是javascript来激活约束。对于大多数脚本运行时(包括JavaScript),语句_this.SomeVariable将导致调用_this.getSomeVariable()getter,而不是直接访问同名的私有字段。

不幸的是,在构造函数中添加验证是不起作用的,正如我在问题中发布的那样。因此,为了解决这个问题,我需要将验证添加到字段中,并将@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);
    }
}
 类似资料:
  • 问题内容: 所以,我正在尝试以编程方式创建一个SceneView 但我收到此错误消息: 由于未捕获的异常“ NSGenericException”而终止应用程序,原因:“无法激活具有锚点的约束,并且它们没有共同的祖先。约束或其锚点是否引用了不同视图层次结构中的项目?那是非法的。 这是部分发生的。如何为该元素添加约束? 问题答案: dan是正确的,您需要先添加为子视图,然后才能锚定它。尝试这样的事情

  • 问题内容: 首先,我创建了一个表,例如 然后在该表中插入值 MySQL没有显示错误,它接受了值。 问题答案: 如果您使用MySQL 8.0.15或更早版本,则MySQL参考手册会说: 该CHECK子句已解析,但所有存储引擎均将其忽略。 尝试触发… 希望能有所帮助。

  • 下面的函数只是将视图移动到一个新位置。它不显示动画:

  • 我有两个组件和。每个组件都是由<code>ConstraintLayout</code>创建的。现在,我从上面的组件创建<code>WelcomeScreen</code>。 用例1:使用静态< code>ConstraintLayout(在< code>ConstraintLayout内的< code>ConstraintLayout) 结果:布局预览不显示任何内容 用例2:<代码>Welcom

  • 我正在使用model属性来获取employee对象。xml文件包含hibernate验证器依赖项。

  • 问题内容: 我试图将@NotNull约束添加到我的Person对象中,但是我仍然可以@POST具有空电子邮件的新Person。我在MongoDB上使用Spring Boot Rest。 实体类: 存储库类: 应用类别: pom.xml 当我通过邮递员@POST一个新对象时,例如: 我仍然使用此有效负载创建: 问题答案: 我遇到了同样的问题,但是仅启用验证对我而言不起作用,这确实与JPA和Mongo