对域模型执行验证



我们的业务域模型具有复杂的验证规则,这些规则只能在模型更新时执行。

像这样:

public classs MyDomainModel {
    public DomainValidationContext getValidationContext() {
       ...
    }
}

我们不想提取这些,因为:

  1. 意味着验证规则的重复。
  2. 列表项有些规则只是"软规则",应该导致警告消息而不停止进一步处理。

我们考虑在Validationr中复制DomainModel,更新值并检查验证错误/警告。

public class SomeValidator implements Validator {
   @Inject
   private DomainEditContext domainEditContext;
   public void validate(final FacesContext context, final UIComponent component, final Object value) {
       MyDomainModel validationModel = domainWorkContext.getDomainModel().clone();
       validationModel.setSomeValue(value);
       DomainValidationContext dvc = validationModel.getValidationContext();
       ...
   }
}

然而,这是相当容易出错和处理密集的,因为每次验证都必须做一个域模型的完整深度拷贝。

是否有更好的方法来执行验证后模型更新/调用应用程序或之前呈现响应?

看一下JsfWarn,它在模型更新和调用应用程序后执行验证。

允许您直接从更新的模型中检索验证上下文。你的警告验证器看起来像这样:

public class SomeValidator implements WarningValidator {
   @Inject
   private DomainEditContext domainEditContext;
   public void validate(FacesContext context, UIComponent component, ValidationResult validationResult) {
       MyDomainModel myModel = domainEditContext.getMyDomainModel();
       DomainValidationContext dvc = myModel.getValidationContext();
       if(dvc.isSomeValueInvalid()) {
          validationResult.setFacesMessage(....);
       }
   }
}

与f:validator类似,你必须在目标组件中添加jw:warning。

<h:inputText id="someValue">
    <jw:warning validator="#{someValidator}" />
    <f:ajax event="change" render="..." />
</h:inputText>
<h:message for="someValue" />

相关内容

  • 没有找到相关文章

最新更新