我们的业务领域模型具有复杂的验证规则,只有在模型更新后才能执行。
这样的事情:
public classs MyDomainModel {
public DomainValidationContext getValidationContext() {
...
}
}
我们不想提取这些,因为:
我们考虑在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();
...
}
}
然而,由于必须为每次验证都要对域模型进行完整的深层复制,因此这是相当容易出错且处理密集的。
有没有更好的方法在模型更新/调用应用程序之后或渲染响应之前执行验证?
欢迎任何其他想法。
答案 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" />