Magnolia - 跨领域验证

Posted

技术标签:

【中文标题】Magnolia - 跨领域验证【英文标题】:Magnolia - Cross field validation 【发布时间】:2020-09-02 13:07:11 【问题描述】:

我们有以下要求。

Field 1 : comboBoxField,必填。

字段 2:组合框字段

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

案例2:如果编辑器选择字段1的值为“value2”,那么字段2是可选的。

如何在提交操作之前在表单/字段验证中进行此验证。

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

任何线索都会对我有很大帮助。我被这个问题困扰了很长时间。

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

【问题讨论】:

【参考方案1】:

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

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

这是我的 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 类型,因此可以从中获取所有属性。

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

【讨论】:

感谢您的解决方案。我们尝试了不同的方法。当用户点击 UI 中的保存按钮时,我们通过读取这些字段的表单视图数据来处理验证,并向他们显示带有适当消息的警报消息。

以上是关于Magnolia - 跨领域验证的主要内容,如果未能解决你的问题,请参考以下文章

为啥 MIT-Kerberos 的“本地领域推荐”失败?

使用 rxjava 和 dagger2 跨线程访问领域

跨领域谷歌分析活动

跨领域谷歌分析活动

在 Magnolia CMS 中创建 Java 模型

Active Directory - Hortonworks 跨领域信任建立