Spring MVC表单验证日期字段

时间:2014-06-05 06:32:31

标签: java spring date spring-mvc

我有一个表单字段应该转换为Date对象,如下所示:

<form:input path="date" />

我要求以下列方式进行验证:

  1. 如果用户将此字段留空。我需要设置一些默认日期。

  2. 如果用户以不可接受的格式投入,我需要提出错误。

  3. 问题在于我可以满足第一或第二要求。

    1. 我可以注册 PropertyEditor ,如果日期不可接受,请设置为null,如果此字段为null,则设置一些默认日期。但是通过这种方法,我无法满足第二个要求,因为如果我将其转换为null,我将无法向用户注册第二个错误。
    2. 我可以设置 @DateTimeFormat(pattern =&#34; dd-MMM-yyyy&#34;)注释并提供相应的typeMismatch错误,但当用户在此处留下空值时仍会返回此错误字段。
    3. 这个问题有什么好办法吗?

2 个答案:

答案 0 :(得分:3)

如果您要从Spring MVC验证器转移到Hibernate,有一种方法可以做到这一点。这不是什么大问题,因为Hibernate验证器可以很好地与Spring Validator接口配合使用(您也可能对支持组的SmartValidator intreface感兴趣)。

之后你可以指定
@NotNull
日期字段上的注释。

在属性文件中添加
NotNull.[formName].[dateField] =如果没有发送日期,将显示此消息 typeMismatch.[formName].[dateField] =如果spring无法将输入转换为日期对象,则会显示此消息(格式验证错误)

对于格式检查,您可以使用CustomDateEditor

使用此解决方案,您将在每种情况下获得预期的验证错误消息。

答案 1 :(得分:1)

当我不得不面对这样的问题时,我会颠倒逻辑。我没有为空字段设置默认值,但是我在操作的渲染部分中使用默认值预加载字段。所以我可以安全地使用@DateTimeFormat(pattern="dd-MMM-yyyy")有效,因为空字段假设用户专有地删除了默认值,这是一个错误。

所以恕我直言,您应该在控制器的GET部分为该表单设置默认值,并坚持使用简单的@DateTimeFormat(pattern="dd-MMM-yyyy")注释。

我有一个使用包含日期字段的@ModelAttribute带注释对象的应用程序。 在对象类中,日期字段在getter和setter上使用DateTimeFormat(pattern="dd/MM/yyyy")进行注释。 Spring(3.2.4)接受日期字段的空值,只将其设置为null。因此,您应该使用@DateTimeFormat(pattern="dd-MMM-yyyy")并仍然可以接受空值。