gpt4 book ai didi

validation - 来自 f :datetimeConverter 的 "Validation Error: Value is not valid"错误

转载 作者:行者123 更新时间:2023-12-03 11:16:12 25 4
gpt4 key购买 nike

以下代码创建了两个单选按钮。每个选项都包含一个日期值,该日期值已成功转换为格式为“yyyy-MM-dd”的标签。一旦我做出选择并单击下一步按钮,我就会收到以下错误“j_idt12:comDateChoice:验证错误:值无效”。这看起来很简单,但有些地方不对劲。你们有谁能看出来吗?

我在 glassfish 中使用 JSF 2.0。

支持bean

public List<SelectItem> getComDateList() {
List<SelectItem> items = new ArrayList<SelectItem>();
Calendar cal = GregorianCalendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.add(Calendar.MONTH, 1);
Date nextFirst = cal.getTime();
cal.add(Calendar.MONTH, 1);
Date followingFirst = cal.getTime();
items.add(new SelectItem(nextFirst, new SimpleDateFormat("yyyy-MM-dd").format(nextFirst)));
items.add(new SelectItem(followingFirst, new SimpleDateFormat("yyyy-MM-dd").format(followingFirst)));
return items;
}

JSF代码

<h:panelGrid columns="2">
<h:outputLabel value="#{msg.FinanceCommencementDate}" for="comDateChoice"/>
<h:selectOneRadio id="comDateChoice" value="#{signUpBean.current.commencementDate}" layout="pageDirection">
<f:convertDateTime type="date" dateStyle="short"/>
<f:selectItems value="#{signUpBean.comDateList}"/>
</h:selectOneRadio>
</h:panelGrid>

最佳答案

如果所选项目值未通过 Object#equals(),则会发生此错误检查任何可用的选择项值。如果 getter 在表单提交请求的应用请求值阶段返回的列表与显示表单的初始请求期间返回的列表不同,就会发生这种情况。

因为您是在 getter 中重建列表而不是在 View 作用域 bean 的构造函数中构造一次,所以 Date对象将在每次调用时获得不同的时间戳,与初始 Date 相比, future 将是几分钟/几秒对象。因此 equals()会失败。

将此逻辑移动到 bean 的构造函数中并重写 getter,以便它执行它应该执行的操作:仅返回数据。不要在 getter 中执行加载逻辑。您还应该将 bean 放在 View 范围内,以便在您提交表单时构造函数不会重新运行。

@ManagedBean
@ViewScoped
public class SignUpBean {

private List<SelectItem> comDateList;

public SignUpBean() {
comDateList = new ArrayList<SelectItem>();
// Fill it here.
}

public List<SelectItem> getComDateList() {
return comDateList; // In getters, do nothing else than returning data!
}

}

更新:转换器也是问题的潜在来源。您基本上已经指示它在呈现 HTML 页面时去除时间。所以它在转换回 Date 时使用默认时间.要么使用

<f:convertDateTime pattern="yyyy-MM-dd HH:mm:ss.SSS Z" />

或在 Calendar 上重置时间和时区事先:

cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
cal.setTimeZone(TimeZone.getTimeZone("GMT"));

这样你就可以只使用 <f:convertDateTime type="date" />

关于validation - 来自 f :datetimeConverter 的 "Validation Error: Value is not valid"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5406700/

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