Springboot/JPA- 将日期传递给 REST API 中的控制器 - 无法将 PathVariable java.sql.Date 转换为 java.sql.Date

Springboot / JPA- Passing Date to controller in REST API - cannot convert PathVariable java.sql.Date to java.sql.Date

我有 DB2 table,其中 SOLD_DATE 字段是 TIMESTAMP 类型(例如 2017-12-07 08:43:23)。

我希望能够向我的控制器发送 URL 提供开始和结束日期 URL 参数,如下所示:

http://localhost:8080/irwapi/v1/logs/2014-10-20/2021-10-20

我的控制器看起来像:

@GetMapping(path = "/{startDate}/{endDate}")
public List<CarResponse> getCarsSoldBetween(
    @PathVariable("startDate") @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate, 
    @PathVariable("endDate") @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate) {
  List<CarResponse> cars = myRepository.getCarsSoldBetween(startDate, endDate);
  return cars;
}

myRepository 的 @Query 方法定义如下:

@Query("select c from CarEntity c where c.carType = 'SPORT' and C.soldDate between  ?1 and ?2") 
List<CarEntity> getCarsSoldBetween(Date startDate, Date endDate);

当我执行上面的方法时,上面的 @Query 方法抛出错误:

“无法将类型 'java.lang.String' 的值转换为所需类型 'java.sql.Date';嵌套异常为 org.springframework.core.convert.ConversionFailedException:无法从类型 [[=36= 转换]] 为值“2014-10-20”键入 [@org.springframework.web.bind.annotation.PathVariable @org.springframework.format.annotation.DateTimeFormat java.sql.Date];嵌套异常是 org.springframework.core.convert.ConverterNotFoundException:找不到能够从类型转换的转换器[java.util.Date] 输入 [@org.springframework.web.bind.annotation.PathVariable @org.springframework.format.annotation.DateTimeFormat java.sql.Date]"

有 2 个选项可以解决此问题。

1.On 控制器级别,将适用于控制器内的所有请求。

@InitBinder     
public void initBinder(WebDataBinder binder){       binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true, 10));    
}

字段级别的选项 2。

@DateTimeFormat(pattern = "yyyy-MM-dd")
@Temporal(TemporalType.DATE)

上面的 @DateTimeFormat(pattern = "yyyy-MM-dd") 对我不起作用的原因是我使用的 Date 参数类型是 java.sql.Date 而不是 java.utils.Date.

我将其更改为正确的包后,@DateTimeFormat 开始正常工作。