如何让 Spring MVC 读取日期为“2019-3-29”格式的路径参数?

Posted

技术标签:

【中文标题】如何让 Spring MVC 读取日期为“2019-3-29”格式的路径参数?【英文标题】:How can I get Spring MVC to read a path parameter with a date in "2019-3-29" format? 【发布时间】:2019-08-20 14:02:23 【问题描述】:

我想获取一个作为查询参数传递给 Spring MVC 控制器的日期。

我有这个依赖:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

我的网址如下所示:

http://localhost:8080/userProducts/2?date=2019-3-29

我的控制器类看起来像:

package trainingapp.userproduct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import trainingapp.calculations.NutrientsCalculationFacade;
import trainingapp.historysystemofmeals.HistorySystemService;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

@RestController
public class UserProductController 

    private final NutrientsCalculationFacade userProductCalculationFacade;
    private final UserProductFindOperationService userProductFindOperationService;
    private final HistorySystemService historySystemService;

    @Autowired
    public UserProductController(NutrientsCalculationFacade userProductCalculationFacade, UserProductFindOperationService userProductFindOperationService, HistorySystemService historySystemService) 
        this.userProductCalculationFacade = userProductCalculationFacade;
        this.userProductFindOperationService = userProductFindOperationService;
        this.historySystemService = historySystemService;
    

    //yyyy-MM-dd
    @GetMapping("/userProducts/userID")
    public String getAllEatenSummedNutrientsByGivenIDInParticularDay(@PathVariable int userID,
                                                                     @RequestParam("date")
                                                                     @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date) 
        return historySystemService.getAllEatenSummedNutrientsByGivenIDInParticularDay(userID, date);
    

我收到以下错误:


    "timestamp": "2019-03-29T15:22:44.640+0000",
    "status": 400,
    "error": "Bad Request",
    "message": "Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '2019-3-29'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2019-3-29]",
    "path": "/userProducts/2"

我应该更改或添加什么?我试图用How to use LocalDateTime RequestParam in Spring? I get "Failed to convert String to LocalDateTime" 解决这个问题,但没有成功。

【问题讨论】:

试着把月份放在两位数上,即2019-03-29 【参考方案1】:

2019-3-29 是一个错误的输入400 状态码是准确的。请参阅DateTimeFormat.ISO#DATE 文档:

最常见的 ISO 日期格式yyyy-MM-dd,例如“2000-10-31”。

因此,要匹配上述格式,您的输入应改为 2019-03-29

【讨论】:

以上是关于如何让 Spring MVC 读取日期为“2019-3-29”格式的路径参数?的主要内容,如果未能解决你的问题,请参考以下文章

请教在Spring MVC中,如何实现启动时从数据库读取信息

spring mvc中如何读取数据库

如何让Spring MVC接收的参数可以转换为java对象

如何将 Spring Boot 项目迁移到旧 Spring MVC 项目。面临的问题,如何在遗留 Spring MVC 项目中读取 application.properties 文件

将 Spring MVC 中的默认/全局日期格式设置为 ISO 8601

Spring MVC - 将用户时区的日期转换为 UTC