我想获取在特定日期提交的表单列表。管理员将在“搜索”框中传递日期(从前端开始是字符串,而在后端是ZonedDateTime
)。
我在存储库中将方法编写为:
List<AdmissionForm> findByDateContains(ZonedDateTime datePart);
我的Service类的背景逻辑是:
@Transactional(readOnly = true)
public List<AdmissionFormDTO> findByDate(ZonedDateTime datepart){
return admissionFormRepository.findByDateContains(datepart).stream()
.map(admissionFormMapper::toDto)
.collect(Collectors.toList());
}
“我的资源”端点类似于:
@GetMapping("/admissionForms/date")
@Timed
public List<AdmissionFormDTO> findByDate(@RequestParam("date") String date){
log.debug("REST request to get AdmissionForms by searchTerm :" + date);
//String to ZonedDateTime method conversion from seperate class
ZonedDateTime zDate = SupportUtils.convertStringDateToZoneDateTime(date);
return admissionFormService.findByDate(zDate);
}
我已经尝试过使用String搜索项,并且工作正常,但是在使用Date搜索时只会遇到麻烦。
我遇到了类似的异常
java.lang.IllegalArgumentException: Parameter value [%2018-11-20T00:00Z%] did not match expected type [java.time.ZonedDateTime (n/a)]' and exception = 'Parameter value [%2018-11-20T00:00Z%] did not match expected type [java.time.ZonedDateTime (n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value [%2018-11-20T00:00Z%] did not match expected type [java.time.ZonedDateTime (n/a)]'
进行一些更正,以便我可以按预期的日期进行搜索。
已编辑:
我将数据类型从ZoneDateTime
更改为LocalDate
,并相应地解决了以下问题(暂时略过计时):
我的存储库代码:
List<AdmissionForm> findByDate(LocalDate datePart);
我的服务等级:
@Transactional(readOnly = true)
public List<AdmissionFormDTO> findByDate(String datepart){
LocalDate localDatePart = SupportUtils.convertStringDateToLocalDate(datepart);
return admissionFormRepository.findByDate(localDatePart).stream()
.map(admissionFormMapper::toDto)
.collect(Collectors.toList());
}
我的资源入口点:
@GetMapping("/admissionForms/date")
@Timed
public List<AdmissionFormDTO> findByDate(@RequestParam("date")String date){
log.debug("REST request to get AdmissionForms by searchTerm :{}",date);
return admissionFormService.findByDate(date);
}
感谢您的建议,但找不到与ZondDateTime
配合使用的方法,因此我们对要求进行了一些更改。希望其他人在这里可以从问题和建议答案中获得帮助。
答案 0 :(得分:1)
使用DateTimeFormat
注释,该注释默认处理ISO yyyy-MM-dd'T'HH:mm:ss.SSSZ
日期时间格式:
public List<AdmissionFormDTO> findByDate(
@RequestParam("date") @DateTimeFormat ZonedDateTime date) {
return admissionFormService.findByDate(date);
}
如果您的日期不包含示例中的秒数字段,则应进一步自定义@DateTimeFormat
。