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
开始正常工作。
我有 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
开始正常工作。