如何在对Spring MVC Controller的GET请求中接受Date参数?


122

我有一个GET请求,该请求以YYYY-MM-DD格式发送日期到Spring Controller。控制器代码如下:

@RequestMapping(value="/fetch" , method=RequestMethod.GET)
    public @ResponseBody String fetchResult(@RequestParam("from") Date fromDate) {
        //Content goes here
    }

当我正在检查Firebug时,请求已正确发送。我得到错误:

HTTP状态400:客户端发送的请求在语法上不正确。

如何使控制器接受这种日期格式?请帮忙。我究竟做错了什么?

Answers:


250

好的,我解决了。写给那些在一整天不间断的编码后可能会累并且错过这种愚蠢的事情的人。

@RequestMapping(value="/fetch" , method=RequestMethod.GET)
    public @ResponseBody String fetchResult(@RequestParam("from") @DateTimeFormat(pattern="yyyy-MM-dd") Date fromDate) {
        //Content goes here
    }

是的,很简单。只需添加DateTimeFormat批注。


18
我本打算写一个答案,但你打败了我。您也可以使用@DateTimeFormat(iso = ISO.DATE),这是相同的格式。顺便说一句,如果可以的话,我建议您使用Joda DateTime库。Spring非常好地支持它。
卢西亚诺

答案通常还可以,但是!有没有一种方法可以将其配置为Spring的默认值?放入@DateTimeFormat您拥有的每个控制器都有些过头了……
thorinkor

3
@Luciano当然也可以使用@DateTimeFormat(iso = ISO.DATE_TIME)
kiedysktos

2
@thorinkor在Spring Boot中,您可以在中设置spring.mvc.date-format属性application.properties或添加实现org.springframework.format接口的bean (扩展org.springframework.format.datetime.DateFormatter可能是方法)。在非启动Spring中,您可以@Override在那里添加Formatter实现bean 的addFormatters方法WebMvcConfigurerAdapter并在其中添加。
UTF_or_Death

10

这就是我从前端获取格式化日期的方法

  @RequestMapping(value = "/{dateString}", method = RequestMethod.GET)
  @ResponseBody
  public HttpStatus getSomething(@PathVariable @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) String dateString) {
   return OK;
  }

您可以使用它来获取所需的内容。


11
没明白。如果您将dateString作为字符串而不是Date接收到,则将@DateTimeFormat添加到@PathVariable有什么意义?
伊利亚飓风

7

...或者您可以以正确的方式进行操作,并为整个应用程序中的日期序列化/反序列化制定一致的规则。把它放在application.properties中:

spring.mvc.date-format=yyyy-MM-dd

3

以下解决方案非常适合Spring Boot应用程序。

控制器:

@GetMapping("user/getAllInactiveUsers")
List<User> getAllInactiveUsers(@RequestParam("date") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") Date dateTime) {
    return userRepository.getAllInactiveUsers(dateTime);
}

因此,在调用方(在我的情况下,它是一个网络通量)中,我们需要以这种格式传递日期时间(“ yyyy-MM-dd HH:mm:ss”)。

来电方:

public Flux<UserDto> getAllInactiveUsers(String dateTime) {
    Flux<UserDto> userDto = RegistryDBService.getDbWebClient(dbServiceUrl).get()
            .uri("/user/getAllInactiveUsers?date={dateTime}", dateTime).retrieve()
            .bodyToFlux(User.class).map(UserDto::of);
    return userDto;
}

仓库:

@Query("SELECT u from User u  where u.validLoginDate < ?1 AND u.invalidLoginDate < ?1 and u.status!='LOCKED'")
List<User> getAllInactiveUsers(Date dateTime);

干杯!!


2

如果要使用PathVariable,则可以使用下面的示例方法(所有方法都是相同的,并且都执行相同的操作):

//You can consume the path .../users/added-since1/2019-04-25
@GetMapping("/users/added-since1/{since}")
public String userAddedSince1(@PathVariable("since") @DateTimeFormat(pattern = "yyyy-MM-dd") Date since) {
    return "Date: " + since.toString(); //The output is "Date: Thu Apr 25 00:00:00 COT 2019"
}

//You can consume the path .../users/added-since2/2019-04-25
@RequestMapping("/users/added-since2/{since}")
public String userAddedSince2(@PathVariable("since") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date since) {
    return "Date: " + since.toString(); //The output is "Date: Wed Apr 24 19:00:00 COT 2019"
}

//You can consume the path .../users/added-since3/2019-04-25
@RequestMapping("/users/added-since3/{since}")
public String userAddedSince3(@PathVariable("since") @DateTimeFormat(pattern = "yyyy-MM-dd") Date since) {
    return "Date: " + since.toString(); //The output is "Date: Thu Apr 25 00:00:00 COT 2019"
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.