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的校验规则。
可行解决方案
- 调整自定义参数解析器的优先级,使其高于内置解析器
在实现WebMvcConfigurer的配置类中,重写addArgumentResolvers方法时将你用来从USER_ID请求头解析注入profileId的自定义解析器放在列表最前面:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { // 0代表插在列表第一位,优先级最高 resolvers.add(0, new CustomProfileIdArgumentResolver()); } }
- 显式给
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);
- 检查适配 Spring Boot 2.x 的全局Web配置
如果之前有通过全局配置修改@RequestParam默认必填规则的逻辑,需要核对 Spring Boot 2.x 的配置属性名是否发生变更,调整为适配2.x版本的配置。
内容的提问来源于stack exchange,提问作者user3250123
相关产品推荐
相关产品推荐

