绑定到LocalDate的Spring表单控件默认为now

时间:2013-06-06 13:35:19

标签: java spring-mvc binding

我使用Spring表单绑定了出生日期的三个选择控件(日,月和年):选择一个org.joda.time.LocalDate。

由于出生日期是可选的,如果日期默认为空,我希望如此。但是,出生日期是在今天的日期初始化的。即使我在模型中将出生日期设置为null,也会发生这种情况。

这意味着今天的日期将在提交表单时作为该字段的值发送,这不是我想要的。我并不太关心日期是如何存储在数据库中的,只要空表示是明确的(尽管null当然比例00:00这样的东西更好)。

我该如何解决这个问题?我可以为LocalDate编写一个包装器,它的默认值为null,并且只有在表单绑定调用setter时才初始化LocalDate。这似乎是一个相当普遍的问题,所以也许有更好的方法。

1 个答案:

答案 0 :(得分:1)

我找到了解决这个问题的部分方法,但我承认我不明白为什么会这样。将控件移动到JSP标记中有所帮助。这显示第一页视图上没有选定日期。如果用户输入日期并提交,则会在页面刷新时显示。

然而,当提交表单时,选择为空,提交三个选择的隐藏输入的值使用datepicker(绑定到今天的日期),这是不可取的。如果隐藏的输入也没有被填充,那将是理想的,但我认为将LocalDate包装为将日期字段初始化为null或空字符串的对象是实现该目的的唯一方法。这是代码,显示在第一页加载时未选择的日期。

<spring:bind path="${path}.dayOfMonth">
  <select>
       <option value="0"></option>
       <c:forEach items="${days}" var="day">
         <option value="${day}"<c:if test="${date.dayOfMonth eq day}"> selected="selected"</c:if>>${day}</option>
       </c:forEach>
  </select>
</spring:bind>
-- month and year dropdowns
<form:input path="${datepickerPath}" cssStyle="display:none;" />