对域模型执行验证

时间:2015-07-07 11:13:25

标签: validation jsf java-ee jsf-2

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

这样的事情:

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

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

  1. 这意味着重复验证规则。
  2. 列出项目一些规则只是"软规则"这应导致警告信息而不停止进一步处理。
  3. 我们考虑在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();
           ...
       }
    }
    

    然而,由于必须为每次验证都要对域模型进行完整的深层复制,因此这是相当容易出错且处理密集的。

    有没有更好的方法在模型更新/调用应用程序之后或渲染响应之前执行验证?

    欢迎任何其他想法。

1 个答案:

答案 0 :(得分:1)

查看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" />