SpringBoot使用SpringMVC自动绑定参数失效
公司有多个项目,全部采用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默认的约定,导致约定失效,而又没有进行解决,那么就等于是挖了一个坑,等着后来者来跳。
关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接
本文链接:https://choupangxia.com/2021/01/06/springboot-param-binding/