You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot使用对象接收查询过滤参数时映射失效问题

问题原因

你遇到的查询参数仅第一个生效、分页参数始终取默认值、过滤对象字段大量为null的问题由两个常见原因共同导致:

  1. 你的ForecastFilterCriteria类同时使用了Lombok的@Builder和@Data注解:@Builder会默认生成全参构造方法,此时@Data不会自动生成无参构造方法,而Spring MVC做查询参数POJO绑定时,优先通过无参构造实例化对象,再通过setter方法注入字段值;没有无参构造时Spring会走构造器参数匹配,只能按顺序匹配到URL里的第一个查询参数,后续参数全部绑定失败。
  2. 你测试用的curl命令没有给URL加引号:Shell环境下&是后台运行指令标识,不加引号时URL里第一个&后面的所有参数都会被截断,根本不会发送到服务端,进一步加剧了参数丢失的问题。
修复方案

按以下步骤调整即可恢复正常参数绑定:

  • 给过滤对象补充构造方法注解,兼容Spring参数绑定和Lombok Builder逻辑,修改后的类定义如下:
@Data
@Builder
@NoArgsConstructor // 生成无参构造,供Spring实例化绑定对象使用
@AllArgsConstructor // 保留全参构造,保证@Builder注解正常生效
public class ForecastFilterCriteria {
    private String forecastId;
    private String forecastName;
    private String forecastGroupName;
    private String latestVersion;
    private ForecastStatus status;
    private PlanHorizon planHorizon;
    private Interval interval;
    private String  forecasterName;
    private Long createdAt;
    private Long modifiedAt;
    private String createdBy;
    private String modifiedBy;
}
  • 确认Controller层的接口方法没有给ForecastFilterCriteria、Pageable参数加@RequestBody注解,GET请求的查询参数不需要走请求体解析,Spring默认会自动把URL上的平级参数绑定到POJO和Pageable对象的同名字段,不需要额外加@ModelAttribute等注解。
  • 测试时给curl的URL加上双引号,避免Shell截断参数,正确的测试命令示例:
curl "http://localhost:8443/v2/forecast/?forecasterName=Pradeep&forecastId=myId&page=1&size=10"

不要尝试用forecastFilterCriteria={JSON串}的格式传参,这种格式Spring默认不会做JSON反序列化,只会把整个JSON串当成forecastFilterCriteria字段的字符串值,必然绑定失败。

如果按以上步骤调整后仍然存在参数绑定问题,检查项目中是否自定义了WebMvcConfigurer实现,覆盖了Spring默认的POJO参数解析器、Pageable参数解析器,如果有自定义配置把默认解析器重新注册即可。

内容的提问来源于stack exchange,提问作者Kshitij Kohli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 13:18:16