【问题标题】:Spring MVC - parse date and show binding errorsSpring MVC - 解析日期并显示绑定错误
【发布时间】:2016-01-28 19:42:10
【问题描述】:

在 Spring MVC 控制器中,我想从使用 @DateTimeFormat 的请求中解析 Date,并且在解析错误的情况下,我想在我的视图中显示一条错误消息,指示日期无效.

这是我的控制器方法:

@RequestMapping(method = RequestMethod.POST)
public String form(
    @ModelAttribute 
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date date, 
    BindingResult result) {
    if (result.hasErrors()) {
        System.out.println(result.toString()); // (1)
    }
    System.out.println(date); // (2)

    return "home";
}

期待

“Happy case”(用于date=1999-10-24):我希望(2) 打印日期。

“错误案例”(无法解析的日期):我希望(1) 打印有关解析失败的详细信息。

实际发生了什么

“Happy case”(对于date=1999-10-24):(1) 打印拒绝值,(2) 打印正确解析的日期:

org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'date' on field 'date': rejected value [1999-10-24]; ...
Sun Oct 24 00:00:00 CEST 1999

“错误案例”:我在浏览器中看到400 Bad Request

Wed Oct 28 20:57:54 CET 2015
There was an unexpected error (type=Bad Request, status=400).
Failed to convert value of type 'java.lang.String' to required type 'java.util.Date';

我可以用 Spring Boot 1.2.7.RELEASE 重现这个。

示例链接:https://github.com/shaehnel/spring-mvc-date

我错过了什么?谢谢!

【问题讨论】:

  • 尝试给模型属性起个名字; ...@ModelAttribute("date")...
  • 谢谢。我试过了,但没有任何区别。
  • 这太奇怪了,我相信还有其他问题。您发布的代码确实是您测试过的代码,还是您为 stackoverflow 帖子修改了它们?
  • 我已将示例应用程序移至 Github 以供所有人验证行为,并将链接添加到我的问题中。该示例是一个简单的 Spring 启动应用程序,我在其中添加了上面显示的控制器方法。我不知道在 Spring MVC 中配置了其他任何东西。
  • 该问题可以通过 GitHub 上显示的示例重现。对于后一种“你好”的情况,似乎在docs.spring.io/spring-framework/docs/current/javadoc-api/org/… 可以采取行动之前发生了异常。对于第一种情况,即使转换实际上是成功的,也似乎对记录的内部异常进行了一些不正确的处理。

标签: spring date spring-mvc binding


【解决方案1】:

我已下载您的代码并确认我观察到了相同的行为。这种行为是出乎意料的,但另一方面,我没有发现*任何提示可以将格式注释与@ModelAttribute 参数结合使用。

所以我的“解决方法”是使用命令对象而不是 @ModelAttribute 参数。

public static class MyCommandObject {
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
    private Date date;

    public Date getDate() {return date;}
    public void setDate(Date date) {this.date = date;}
}

@RequestMapping(method = RequestMethod.POST)
public String form(@Valid MyCommandObject myCommandObject, BindingResult result) {
    if (result.hasErrors()) {
        System.out.println(result.toString()); 
    }
    System.out.println(myCommandObject.date);

    return "home";
}

*我没找到,是我没找到,不代表不存在。 -- 如果有人能确认这只是一个缺失的功能或真正的错误,那就太好了。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 2011-10-23
相关资源
最近更新 更多