对域模型执行验证
Perform validation on domain model
我们的业务领域模型有复杂的验证规则,只有在模型更新后才能执行。
像这样:
public classs MyDomainModel {
public DomainValidationContext getValidationContext() {
...
}
}
我们不想提取这些,因为:
- 这意味着验证规则重复。
- 列表项的一些规则只是 "soft-rules",它们应该会在不停止进一步处理的情况下产生警告消息。
我们考虑在 Validationr 中复制 DomainModel 以更新值并检查验证 errors/warnings。
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();
...
}
}
然而,由于每次验证都必须制作域模型的完整深层副本,因此这很容易出错并且处理密集。
有没有更好的方法来执行验证 post 模型 update/invoke-application 或在渲染响应之前?
我们非常欢迎任何其他想法。
查看 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" />
我们的业务领域模型有复杂的验证规则,只有在模型更新后才能执行。
像这样:
public classs MyDomainModel {
public DomainValidationContext getValidationContext() {
...
}
}
我们不想提取这些,因为:
- 这意味着验证规则重复。
- 列表项的一些规则只是 "soft-rules",它们应该会在不停止进一步处理的情况下产生警告消息。
我们考虑在 Validationr 中复制 DomainModel 以更新值并检查验证 errors/warnings。
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();
...
}
}
然而,由于每次验证都必须制作域模型的完整深层副本,因此这很容易出错并且处理密集。
有没有更好的方法来执行验证 post 模型 update/invoke-application 或在渲染响应之前?
我们非常欢迎任何其他想法。
查看 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" />