2018-03-29 SpringCloud 下划线参数丢失

场景

遇到一个不常见的问题:
当Controller的参数为 Model参数绑定形式,且参数以下划线开头时,取不到参数,丢失了。

其实这篇文章和SpringCloud关系不大,但是属于Spring家族的相关内容。

例子:

@RestController
public class HealthyController {

    @RequestMapping(value = "/test/param", method = RequestMethod.GET)
    public String testParam(ParamModel param) {
        return param.toString();
    }
    

    public static class ParamModel {
        private String _api;
        private String _app;
    }

}


原理

一言不合翻源码:比Google还快

//WebDataBinder.java

public static final String DEFAULT_FIELD_MARKER_PREFIX = "_";

protected void checkFieldMarkers(MutablePropertyValues mpvs) {
        if (getFieldMarkerPrefix() != null) {
            String fieldMarkerPrefix = getFieldMarkerPrefix();
            PropertyValue[] pvArray = mpvs.getPropertyValues();
            for (PropertyValue pv : pvArray) {
                if (pv.getName().startsWith(fieldMarkerPrefix)) {
                    String field = pv.getName().substring(fieldMarkerPrefix.length());
                    if (getPropertyAccessor().isWritableProperty(field) && !mpvs.contains(field)) {
                        Class<?> fieldType = getPropertyAccessor().getPropertyType(field);
                        mpvs.add(field, getEmptyValue(field, fieldType));
                    }
                    mpvs.removePropertyValue(pv);
                }
            }
        }
    }

这里的含义就是 如果你的URL或者Form里面有 下划线开头的参数,他就给你擦了。

稳住别慌问题不大.png

具体来讲:

  1. 只要你有下划线开头的变量,就给你擦了。
  2. 如果被下划线的变量,还有对应的原始下划线变量,并且没有传原始变量,则填了个空值。

还有这种操作?

问题是谁会用下划线开头的变量?

答曰:PHP,C++,C,Python,谁都有可能。。。。

解决办法

request 里面是可以拿到的,要不就放在ThreadLocal里面?。。
要么,就别用下划线了?
要不,就继承这个DataBinder,替换他的设置?

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 9,700评论 0 13
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 9,461评论 1 10
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 9,957评论 0 5
  • .bat脚本基本命令语法 目录 批处理的常见命令(未列举的命令还比较多,请查阅帮助信息) 1、REM 和 :: 2...
    庆庆庆庆庆阅读 12,624评论 1 19
  • 参考书:《An Introduction to Agent-Based Modeling: Modeling Na...
    大雄君阅读 5,845评论 1 1

友情链接更多精彩内容