SpringBoot使用对象接收查询过滤参数时映射失效问题
问题原因
你遇到的查询参数仅第一个生效、分页参数始终取默认值、过滤对象字段大量为null的问题由两个常见原因共同导致:
- 你的
ForecastFilterCriteria类同时使用了Lombok的@Builder和@Data注解:@Builder会默认生成全参构造方法,此时@Data不会自动生成无参构造方法,而Spring MVC做查询参数POJO绑定时,优先通过无参构造实例化对象,再通过setter方法注入字段值;没有无参构造时Spring会走构造器参数匹配,只能按顺序匹配到URL里的第一个查询参数,后续参数全部绑定失败。 - 你测试用的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
相关产品推荐
相关产品推荐

