如何接受日期参数在一个 GET 请求到春天 MVC 控制器?

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

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

请求发送正确,因为我正在检查 Firebug。 我得到了一个错误:

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

如何使控制器接受这种格式的 Date? 请帮帮我,我做错了什么?

143472 次浏览

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

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

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

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

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

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

... 或者你可以用正确的方法,在你的应用程序中为日期的序列化/反序列化制定一个连贯的规则。属性:

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

如果你想使用一个路径变量,你可以使用下面的一个示例方法(所有的方法都是一样的) :

//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"
}

下面的解决方案非常适用于弹簧启动应用程序。

总监:

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

因此在调用者中(在我的例子中是 web 通量) ,我们需要以这种(“ 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);

干杯!

你可使用:

Public@ResponseBody String fetchResult (@ RequestParam (“ from”)@DateTimeFormat (pattern = “ yyyy-MM-dd”) Date from Date){ 你的密码..。

}

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...
}