【问题标题】:Spring MVC form validation Date fieldSpring MVC 表单验证日期字段
【发布时间】:2014-07-26 00:43:37
【问题描述】:

我有一个表单域,应该转换为 Date 对象,如下:

<form:input path="date" />

并且我需要通过以下方式进行验证:

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

  2. 如果用户以不可接受的格式输入,我需要显示错误。

问题是我可以满足第一个或第二个要求。

  1. 我可以注册PropertyEditor,如果日期不可接受,则设置为空,如果此字段为空,请设置一些默认日期。但是使用这种方法,我无法满足第二个要求,因为如果我将其转换为 null,我将无法向用户注册第二个错误。
  2. 我可以设置 @DateTimeFormat(pattern="dd-MMM-yyyy") 注释并提供适当的 typeMismatch 错误,但当用户在此字段中留空值时仍会返回此错误。

这样的问题有什么好的解决办法吗?

【问题讨论】:

  • 你确定你只有 @DateTimeFormat(pattern="dd-MMM-yyyy") 并且它在 getter/setter 上吗?因为我确实使用了该注释并且它接受空字段(Spring 3.2.4)
  • 这个字段是否作为“”传递?
  • 使用日期选择器,并强制格式化
  • 在我的应用程序中,我设法窥探了请求的内容。该字段作为 name=&amp; 传递,这是一个空值,我在我的对象中将它作为 null (完整对象注释为 @ModelAttribute

标签: java spring date spring-mvc


【解决方案1】:

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

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

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

【讨论】:

  • 是的,您可以在表单中预先填写此值,但用户可以删除此值并发送此类表单。之后,您将面临我描述的此类问题。如果我误解了您的回答,请告诉我
  • 如果我预填充了该值并且用户放弃了它,我知道他不想要这个默认值并且他更喜欢空值。所以我不想在数据库中默默地保留默认值,我更喜欢发送一个错误,说该字段不能为空(我再次建议默认值)。如果您说如果该字段不为空,则日期必须为空,那将有所不同。无论如何,我知道我已经接受了带有@DateTimeFormat(pattern="dd-MMM-yyyy") 注释的字段中的空值。当我找到方法时,我会更新我的答案。
  • 对我来说这两种情况都可以:1. 如果用户丢弃所有内容,则返回:此字段不能为空;2.如果输入无效:您的日期格式...,但看起来 Spring 每次都会返回不正确的格式。
  • @user1459144 我已经准确地更新了我的答案,对空白字段进行管理。
【解决方案2】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 2012-12-22
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 2011-08-29
    相关资源
    最近更新 更多