gpt4 book ai didi

validation - 日期范围验证

转载 作者:行者123 更新时间:2023-12-03 21:05:45 29 4
gpt4 key购买 nike

我想比较两个日期(StartDate 和 EndDate)并检查一个是否在另一个之前。最简单的解决方案是在 backing bean 上执行此操作并“短路”该方法。

但是,此验证不会与其他表单验证同时发生。例如,如果我有另一个需要验证的字段(除了日期)并且输入无效,我只会收到该特定字段的消息。只有当其他字段有效时,我才会根据支持 bean 获得日期验证。

有人有解决方案吗?

最佳答案

However this validation does not happen concurrently with the other form validations.



支持 bean 操作方法确实不打算执行输入验证。

Anyone have a solution?



为工作使用正确的工具;使用普通 Validator .
@FacesValidator("dataRangeValidator")
public class DateRangeValidator implements Validator {
// ...
}

反过来,使用单个验证器验证多个输入值确实是另一回事。基本上,您应该抓取/传递其他组件或其值到 validate()方法实现。在最简单的形式中,您可以使用 <f:attribute>为了这。假设您正在使用 <p:calendar>要选择日期,这是一个具体的启动示例:
<p:calendar id="startDate" binding="#{startDateComponent}" value="#{bean.startDate}" pattern="MM/dd/yyyy" required="true" />
<p:calendar id="endDate" value="#{bean.endDate}" pattern="MM/dd/yyyy" required="true">
<f:validator validatorId="dateRangeValidator" />
<f:attribute name="startDateComponent" value="#{startDateComponent}" />
</p:calendar>

(注意 binding 属性,它使组件在 EL 范围内完全可用给定的变量名;还要注意这个例子是原样的,你绝对不应该将它绑定(bind)到 bean 属性!)
dateRangeValidator看起来像这样:
@FacesValidator("dateRangeValidator")
public class DateRangeValidator implements Validator {

@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
if (value == null) {
return; // Let required="true" handle.
}

UIInput startDateComponent = (UIInput) component.getAttributes().get("startDateComponent");

if (!startDateComponent.isValid()) {
return; // Already invalidated. Don't care about it then.
}

Date startDate = (Date) startDateComponent.getValue();

if (startDate == null) {
return; // Let required="true" handle.
}

Date endDate = (Date) value;

if (startDate.after(endDate)) {
startDateComponent.setValid(false);
throw new ValidatorException(new FacesMessage(
FacesMessage.SEVERITY_ERROR, "Start date may not be after end date.", null));
}
}

}

如果你碰巧使用 JSF utility library OmniFaces , 那么你也可以只使用它的 <o:validateOrder> component .无需自定义验证器即可实现以下要求:
<p:calendar id="startDate" value="#{bean.startDate}" pattern="MM/dd/yyyy" required="true" />
<p:calendar id="endDate" value="#{bean.endDate}" pattern="MM/dd/yyyy" required="true" />
<o:validateOrder components="startDate endDate" />

也可以看看:
  • JSF doesn't support cross-field validation, is there a workaround?
  • 关于validation - 日期范围验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19093192/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com