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

Spring Boot版本升级后REST API行为不一致问题求助

问题根因
  • Spring Boot 2.3.0 对应 Spring Framework 5.2.x 版本,相比 Spring Boot 1.5.x 对应的 Spring 4.3.x,调整了 @RequestParam 注解标注参数的解析优先级:Spring 4.3.x 中自定义 HandlerMethodArgumentResolver 的优先级高于内置的 RequestParamMethodArgumentResolver,你项目中存在的自定义参数解析器会从 USER_ID 请求头取值注入到 profileId 参数,因此即使请求参数未携带也能正常赋值;而 Spring 5.2.x 中将内置 RequestParamMethodArgumentResolver 的优先级调整到自定义解析器之前,会先校验请求参数中是否存在 profileId,不存在时直接抛出 MissingServletRequestParameterException,不会走到后续自定义解析逻辑。
  • 另一个可能性是你之前在 Spring Boot 1.5 中配置的全局修改 @RequestParam 默认必填属性的配置项,在 Spring Boot 2.x 中因属性路径变更失效,导致 @RequestParam 恢复默认 required = true 的校验规则。
可行解决方案
  1. 调整自定义参数解析器的优先级,使其高于内置解析器
    在实现 WebMvcConfigurer 的配置类中,重写 addArgumentResolvers 方法时将你用来从 USER_ID 请求头解析注入 profileId 的自定义解析器放在列表最前面:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        // 0代表插在列表第一位,优先级最高
        resolvers.add(0, new CustomProfileIdArgumentResolver());
    }
}
  1. 显式给 profileId 的 @RequestParam 标注 required = false
    修改接口定义,关闭 profileId 参数的请求参数必填校验,内置解析器未找到请求参数时不会抛出异常,会继续交给后续自定义解析器从请求头取值:
@RequestMapping(value = "/card", method = RequestMethod.GET)
public CardRespDTO getCards(@RequestParam(required = false) String profileId, 
                            @RequestParam(required = false) String banner, 
                            @RequestParam(required = false) String paymentGatewayVersion);
  1. 检查适配 Spring Boot 2.x 的全局Web配置
    如果之前有通过全局配置修改 @RequestParam 默认必填规则的逻辑,需要核对 Spring Boot 2.x 的配置属性名是否发生变更,调整为适配2.x版本的配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:36:03