135

我有一个 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:客户端发送的请求语法错误。

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

4

7 回答 7

271

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

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

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

于 2013-03-01T19:03:20.290 回答
13

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

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

你可以用它来得到你想要的。

于 2017-09-04T03:05:36.880 回答
12

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

spring.mvc.date-format=yyyy-MM-dd
于 2019-03-06T21:54:14.227 回答
7

以下解决方案非常适用于 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);

干杯!!

于 2019-12-05T08:00:28.067 回答
4

如果你想使用 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"
}
于 2019-04-25T21:30:03.377 回答
1

您可以使用 :

public @ResponseBody String fetchResult( @RequestParam("from")@DateTimeFormat(pattern="yyyy-MM-dd") Date fromDate) { //你的代码...

}
于 2021-04-05T20:39:24.883 回答
1

2000-10-31T01:30:00.000-05:00 转换为日期时间 (Joda)

@GetMapping("test/{dateTimeStart}")
public void getCheckDaily2(
        @PathVariable(value = "dateTimeStart", required = false)
            @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
                DateTime dateTimeStart){

body here...
}
于 2021-11-19T14:25:03.493 回答