公司有多个项目,全部采用SpringBoot+SpringMVC的架构,正常来说,在SpringBoot项目中如果参数的名称和请求的参数保持一致,SpringBoot会自动帮我们将参数值进行绑定。

比如请求的URL为:/user/addUser?username=zhangsan&age=13

那么在SpringBoot的Controller当中我们可以这样直接使用:

@PostMapping("addUser")
public void addUser(String username,int age) {
}

通过上述写法,SpringBoot会自动进行参数绑定,我们直接使用username和age即可。

如果参数名称与方法名称不一致,我们也可以使用@RequestParam(“username”)的形式来指定:

@PostMapping("addUser")
public void addUser(@RequestParam("username") String username, int age) {
}

但发现接手的项目大家所有的地方都用了@RequestParam(“username”)这种形式,很是好奇,就问开发人员,为什么每个地方都使用注解,为什么不采用默认的形式呢?

结果开发人员的答复是:有时候有效,有时候无效。恰恰昨天,因为某个方法没有使用@RequestParam注解导致参数无法绑定,于是就进行了彻底排查。

最后,找到了原因,原来同事在使用SpringMVC的配置时将SpringBoot默认的参数解析器给覆盖掉了,采用自己指定的参数解析器,这就导致自动参数绑定失效,只能使用@RequestParam。

所以,当你出现类似问题时,需要核查一下继承WebMvcConfigurationSupport或实现WebMvcConfigurer的SpringMVC配置类中是否重新实现了如下方法:

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
    argumentResolvers.add(currentUserMethodArgumentResolver());
    super.addArgumentResolvers(argumentResolvers);
}

@Bean
public CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver() {
    return new CurrentUserMethodArgumentResolver();
}

addArgumentResolvers方法会覆盖掉SpringBoot默认的参数绑定方法,导致参数绑定无效。

最后,我跟同事说:有时候遇到问题直接找到问题根源,解决它,而不是绕开它。想现在这样修改了SpringBoot默认的约定,导致约定失效,而又没有进行解决,那么就等于是挖了一个坑,等着后来者来跳。



SpringBoot使用SpringMVC自动绑定参数失效插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:http://www.choupangxia.com/2021/01/06/springboot-param-binding/