params和multipartform-data两种类型的参数中有同名参数的解析问题

同时使用params和multipart/form-data两种参数类型不符合常规套路,一般不会这么做。最近有个老代码有这样的使用场景。在升级了spring和springBoot版本以后,以前能用的接口报错了。报错的内容就是参数解析不正常,这个参数在params和multipart/form-data中都有,并且名称相同,一个是字符串,一个是int,在Controller中使用int类型接收参数。报错String数组无法被转成int。记录一下调试结果

无论什么版本的spring和springBoot,这两种类型的同名参数都会被合并为一个数组,只不过加到到数组中的时候先后顺序不同,取值的时候org.springframework.core.convert.support.ArrayToObjectConverter中的convert方法,只取数组第一个值。5.1.11版本能先加载params中的参数,但5.2.5中会先加载form-data中的参数,所以现象是5.1.11版本没有问题可以转为Integer类型参数,5.2.5版本参数解析错误字符串无法转为Integer。

Spring5.1.11 + springBoot2.1.11时,调试到org.springframework.core.convert.support.ArrayToObjectConverter中的convert方法是,看到
数组中为

{"123", "application/zip"}

Spring 5.2.5 + springBoot2.2.6
中为

{"application/zip","123"}

之所以5.1.11版本能先加载params中的参数123,是因为HiddenHttpMethodFilter这个过滤器中调用了request.getParameter(this.methodParam) 方法去获取params参数,这会使Params中的参数优先解析。这个过滤器在5.1.11版本上默认开启,在5.2.5上默认关闭

spring5.1.11 + springBoot2.1.11

    {
    
    
      "name": "spring.mvc.hiddenmethod.filter.enabled",
      "type": "java.lang.Boolean",
      "description": "Whether to enable Spring's HiddenHttpMethodFilter.",
      "defaultValue": true
    }

Spring 5.2.5 + springBoot2.2.6

    {
    
    
      "name": "spring.mvc.hiddenmethod.filter.enabled",
      "type": "java.lang.Boolean",
      "description": "Whether to enable Spring's HiddenHttpMethodFilter.",
      "defaultValue": false
    }

现在要在高版本中解决这个问题的话,就把这个过滤器开起来,让params中的参数先加载即可。使用这个配置项 spring.mvc.hiddenmethod.filter.enabled=true

这个过滤器是用来支持浏览器发送除GET,POST请求类型以外其他请求的https://www.jianshu.com/p/1a2fb486dfea,可以开启对其他请求影响不大 ,问题即可解决。

但是这么解决有些取巧,还是建议使用良好的接口风格,最起码不要用同名参数。

猜你喜欢

转载自blog.csdn.net/u013041642/article/details/106576351