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 - 跨领域验证的主要内容,如果未能解决你的问题,请参考以下文章