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 类型,因此可以从中获取所有属性。
唯一的问题是,错误消息不会突出显示内部字段,只会突出显示整个复杂字段。
我们有以下要求。
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 类型,因此可以从中获取所有属性。
唯一的问题是,错误消息不会突出显示内部字段,只会突出显示整个复杂字段。