Spring Boot待办应用按用户ID与日期区间过滤返回空数组问题排查
问题排查及解决方案
问题根因
- DTO属性与请求参数不匹配:FilterTodoByUserDto中用户ID字段名为
id,但请求体中传的键是userId,JSON反序列化时无法映射,导致dto.getId()返回null,无法匹配数据库的user_id字段。 - 日期区间顺序错误:Spring Data JPA的
Between关键字要求第一个参数为区间起始值(较小值),第二个为区间结束值(较大值)。请求中date1为2021-01-01、date2为2000-01-01,等同于查询date BETWEEN '2021-01-01' AND '2000-01-01',无符合条件的记录。 - GET请求错误使用@RequestBody:HTTP GET协议规范不建议携带请求体,Spring默认不会处理GET请求的请求体参数,导致DTO所有属性都为
null,查询条件无效。 - 日期反序列化配置缺失:DTO中的
date1、date2是java.util.Date类型,没有添加序列化注解的情况下,直接传入字符串格式的日期会导致反序列化失败,日期属性为null。
解决方案
- 修正DTO属性映射与日期序列化配置:修改FilterTodoByUserDto的字段与请求参数匹配,同时添加日期序列化注解避免反序列化失败:
public class FilterTodoByUserDto { private Long userId; // 原id改为userId和请求参数匹配 @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") private Date date1; @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") private Date date2; // 同步修改原getId/setId为getUserId/setUserId public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } // 其余getter、setter保持不变 } - 增加日期顺序容错逻辑:在Service层自动调整日期顺序,避免前端传参顺序错误导致查询失效:
public List<Todo> filterTodosByUserId(FilterTodoByUserDto dto){ Date date1 = dto.getDate1(); Date date2 = dto.getDate2(); // 自动交换日期保证起始日期小于结束日期 if(date1.after(date2)){ Date temp = date1; date1 = date2; date2 = temp; } return todoRepository.findTodosByDateBetweenAndUserId(date1, date2, dto.getUserId()); } - 修正接口请求方式:将原GET接口改为POST,支持请求体传参:
@PostMapping("user/todos/filter") // 替换原@GetMapping public List<Todo> filterTodosById(@RequestBody FilterTodoByUserDto dto){ return todosService.filterTodosByUserId(dto); } - 调整请求参数:修正后的请求体示例如下:
{"userId":1, "date1":"2000-01-01", "date2":"2021-01-01"}
内容的提问来源于stack exchange,提问作者humblecoder
相关产品推荐
相关产品推荐

