Spring Boot Controller如何接收React表格传递的嵌套索引格式查询参数
解决方案
错误原因
你的报错是由3个核心不匹配问题导致的:
- 属性名不匹配:前端传递的过滤参数前缀为
filtered,但你的SearchDTO中定义的过滤列表字段名为filters,Spring MVC参数绑定无法对应 - 字段类型错误:你定义的过滤参数类中
id为int类型,但前端传递的filtered[N][id]是字符串类型的表列名,无法完成类型转换 - 命名不统一:你定义的过滤参数类名为
SearchFilters,但SearchDTO中声明的列表泛型为FilterDTO,类名不匹配
修正步骤
1. 统一并修正过滤参数类
// 统一命名为FilterDTO,修正id字段类型为字符串 public class FilterDTO { // 存储前端传递的列名,用String类型 private String id; // 存储前端传递的过滤值 private String value; // 必须添加无参构造 public FilterDTO() {} // 必须添加所有字段的getter、setter,Spring MVC参数绑定依赖该方法 public String getId() { return id; } public void setId(String id) { this.id = id; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } }
2. 修正SearchDTO定义
public class SearchDTO{ private int pageNumber; private int pageSize; private int total; private int pages; // @JsonFormat注解仅作用于JSON请求/响应体,GET请求查询参数绑定不生效,可删除 private List<Long> ids; // 字段名必须和前端参数前缀"filtered"完全一致 private List<FilterDTO> filtered; // 必须添加无参构造 public SearchDTO() {} // 补全所有字段的getter、setter,此处仅示例过滤字段相关方法 public List<FilterDTO> getFiltered() { return filtered; } public void setFiltered(List<FilterDTO> filtered) { this.filtered = filtered; } public List<Long> getIds() { return ids; } public void setIds(List<Long> ids) { this.ids = ids; } // 请自行补全pageNumber、pageSize等其余字段的getter、setter方法 }
3. 控制器代码无需修改
保持原有控制器代码即可,参数绑定完成后可直接通过searchDTO.getFiltered()获取所有过滤规则:
@GetMapping("/search") public ResponseEntity<DashboardDTO> search(SearchDTO searchDTO){ // 业务逻辑 }
特殊情况处理
如果你使用的Spring Boot版本低于2.2,参数绑定仍报错的话,可以通过直接接收参数Map手动解析的方式处理:
@GetMapping("/search") public ResponseEntity<DashboardDTO> search(@RequestParam Map<String, String> params){ // 手动从params中解析filtered[N][id]、filtered[N][value]格式的参数 }
内容的提问来源于stack exchange,提问作者Guillermo Balboa
相关产品推荐
相关产品推荐

