Magnolia - 跨域验证

Magnolia - Cross field validation

我们有以下要求。

Field 1 : comboBoxField,必填。

字段 2:组合框字段

情况1.如果编辑器选择字段1值为“value1”,则字段2为必填项

情况2:如果编辑器选择Field 1值为“value2”,则filed 2是可选的。

如何在提交操作前的 form/field 验证中进行此验证。

或者我们如何在提交操作中验证。

任何线索都会对我有很大帮助。我在这个问题上卡了很久。

我尝试按照文档中的建议使用跨字段、动态字段、可切换字段和复合字段,但出现空指针异常。如果您知道解决方案,请也分享代码片段。

我也遇到过这种类型的验证。问题在于字段的隔离。我找不到根据另一个字段值验证一个字段的方法。

总之我找到了解决方法。我聚合了两个具有复杂字段的依赖字段并为其创建了一个验证器。

这是我的 Magnolia 5.7 和 vaadin 验证器代码(第 7 版已弃用,但逻辑​​与第 8 版相同)。

public class CompanyRequiredFieldsValidator implements Validator {

    private final ConfiguredFieldValidatorDefinition definition;

    public CompanyRequiredFieldsValidator(ConfiguredFieldValidatorDefinition definition) {
        this.definition = definition;
    }

    @Override
    public void validate(Object value) throws InvalidValueException {
        Optional<String> companyName = getString(value, "companyName");
        if (companyName.isPresent()) {
            getString(value, "companyAddress")
                    .orElseThrow(() -> new InvalidValueException(definition.getErrorMessage()));
        }
    }

    private Optional<String> getString(Object value, String property) {
        return Optional.of(value)
                .filter(Item.class::isInstance).map(Item.class::cast)
                .map(_v -> _v.getItemProperty(property))
                .map(Property::getValue)
                .filter(String.class::isInstance).map(String.class::cast)
                .filter(StringUtils::isNotEmpty);
    }

}

对于复杂字段,验证值具有 com.vaadin.v7.data.Item 类型,因此可以从中获取所有属性。

唯一的问题是,错误消息不会突出显示内部字段,只会突出显示整个复杂字段。