如何在对 Spring MVC 控制器的 GET 请求中接受日期参数?

Posted

技术标签:

【中文标题】如何在对 Spring MVC 控制器的 GET 请求中接受日期参数?【英文标题】:How to accept Date params in a GET request to Spring MVC Controller? 【发布时间】:2013-02-16 09:00:14 【问题描述】:

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

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

【问题讨论】:

我猜你的 Date 来自 java.util.Date 因为提供的答案所以不适用于 Java.sql.Date 【参考方案1】:

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

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

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

【讨论】:

我正要写一个答案,但你打败了我。您也可以使用相同格式的@DateTimeFormat(iso=ISO.DATE)。顺便说一句,如果可以的话,我建议您使用 Joda DateTime 库。 Spring 非常支持它。 答案一般都可以,但是!有没有办法将其配置为 Spring 的默认值?将@DateTimeFormat 放在您拥有的每个控制器中有点矫枉过正...... @Luciano 当然你也可以@DateTimeFormat(iso = ISO.DATE_TIME) @thorinkor 在 Spring Boot 中,您可以在application.properties 中设置spring.mvc.date-format 属性或添加实现org.springframework.format 接口的bean(扩展org.springframework.format.datetime.DateFormatter 可能是要走的路)。在非 Boot Spring 中,您可以 @Override WebMvcConfigurerAdapteraddFormatters 方法并在那里添加您的 Formatter 实现 bean。 人们应该知道 :@DateTimeFormat' 不适用于 'java.sql.Date' 但适用于 'java.util' 日期【参考方案2】:

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

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

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

【讨论】:

没听懂。如果您将 dateString 作为字符串而不是日期接收,那么将 @DateTimeFormat 添加到 @PathVariable 有什么意义?【参考方案3】:

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

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

【讨论】:

不行,用pattern、iso、sane问题试了一下,不能把字符串转成日期 顺便说一句,您使用的是 java.util.Date 还是 kava.sql.Date?这不适用于 Java.sql.Date【参考方案4】:

以下解决方案非常适用于 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”)格式传递日期时间。 p>

调用方:

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);

干杯!!

【讨论】:

【参考方案5】:

如果你想使用 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"

【讨论】:

【参考方案6】:

你可以使用:

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


【讨论】:

【参考方案7】:

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

【讨论】:

以上是关于如何在对 Spring MVC 控制器的 GET 请求中接受日期参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 spring-mvc 中为 REST 查询提供对象列表?

如何解决 Spring MVC 中的多重映射?

如何仅更新已更改的属性 - Spring MVC

如何在Spring MVC控制器类中处理两个jsp表单页面

在 Spring-MVC 控制器中触发 404?

如何指定一个请求参数绑定到某个控制器方法参数而不是Spring MVC中的模型属性?