Java springmvc 参数名用is开头导致为null

因为最近在整理一些源码和编写规范,这里写一下只是记录几年前自己遇到的问题,好久都忘了,还是写下来比较好。

问题记录:由于变量使用了boolean,并且变量名是is开头的,由于java机制boolean默认是false,而参数传递即使为true,在springmvc参数设置的时候,也不会对boolea的is开头的参数做处理,会导致这个值一直是false

原因跟踪:当前端一个请求发过来的时候,请求体是在body里面的,首先,java的boolean值是false
当请求打到controller里面的时候,会先经过springmvc,在AbstractMessageConverterMethodArgumentResolver类的方法【readWithMessageConverters】中进行设置参数,具体路劲和方法如下

org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver#readWithMessageConverters(org.springframework.http.HttpInputMessage, org.springframework.core.MethodParameter, java.lang.reflect.Type)

genericConverter.read做了进一步处理,实际底层调用的是AbstractJackson2HttpMessageConverter类中的read方法,里面获取了java类型等,调用了ObjectMapper,对参数做了序列化处理

在方法中调用了genericConverter.read方法,做了进一步的处理
在这里插入图片描述

接下来要看objectmapper的源码了,这里find的时候,是根据名字isBooleanA来获取对应的值,我们看到现在是有的(因为我的set方法是setIsBooleanA),但是有一种情况会没有,你把你的set方法改成setBooleanA,就没了,如下图所示

在这里插入图片描述
在这里插入图片描述
因为这里为null了,所以就不会invoke参数,所以你的boolean参数,会一直是false,因为java机制,你这里不设置的话,默认false,如果是Boolean,那么就会一直是null

问题来了,_beanProperties为什么这里会拿不到,为null?我参数明明是有的(_beanProperties是BeanPropertyMap实体)

服务起来之后,第一次调用接口,这里会对参数做特殊处理,放入到BeanPropertyMap中,可以看到,boolean值已经变了,我参数名字是isBooleanA,但是这里变成了booleanA

在这里插入图片描述

点的构造方法里面看了下,其实就是参数无法匹配了,这里把参数缓存了,然后你入参请求的时候映射不上了,所以是null
在这里插入图片描述

那么问题来了,是什么原因, 什么时候,把isBooleanA这个变量值改为了booleanA,is去哪里了呢??? 又是什么时候往【_properties】里面放参数的呢???

_properties放值的时候是在BeanDeserializerFactory中的addBeanProps方法中进行的,最下面有个builder.addProperty(prop);,调用了BeanDeserializerBuilder类的addProperty方法,往里面设的值
在这里插入图片描述

而循环用的propDefs参数来自于这里,对入参参数beanDesc.findProperties()进行了特殊处理,然后得到的
在这里插入图片描述

中间省略一万字,直接找beanDesc这个参数是从哪里得到的,如下所示,在这里创建的

com.fasterxml.jackson.databind.deser.DeserializerCache#_createDeserializer

在这里插入图片描述

com.fasterxml.jackson.databind.introspect.BasicClassIntrospector#_findStdTypeDesc这个方法是转换基础数据类型的,实体的话是null,会走得下面的if中,在collectProperties方法中做了处理

在这里插入图片描述
在这里插入图片描述
这里解析出来了get set方法的前缀是什么
在这里插入图片描述

后面继续省略,直接看核心逻辑,直接定位到这里,找他什么时候用反射把数据填进去的,嵌套了一堆,烦死了,找了半天,而且版本也不一样了,之前我都是直接搜coll方法就有,现在还得从新跟源码

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

终于找到了,这个方法原先是coll(),因为我框架版本升级了,变成collectAll()了

在这里插入图片描述
在这里插入图片描述

一直到这里其实都是有的,但是后面有个remove,给删了,就是这个方法,没有匹配的数据,给删了

在这里插入图片描述

框架都是基于反射的,属性的获取和设置,都是基于他的get set方法,有些框架或者使用idea的自动生成get set,都会有一些对参数的特殊处理,比如boolean的is开头参数,会自动把你的is删了,这个时候,由于不符合框架的规则了,就会导致参数无法匹配上。

网上一大堆说怎么处理的,根本原因其实在这里,万物基于反射~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/540199.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里云大学生免费服务器申请流程,2024年最新

阿里云学生服务器免费申请,之前是云翼计划学生服务器9元/月,现在是高校计划,学生服务器可以免费申请,先完成学生认证即可免费领取一台云服务器ECS,配置为2核2G、1M带宽、40G系统盘,在云服务器ECS实例过期之…

python入门(一)配置环境和选择IDE

Python,作为一种简洁易懂的编程语言,近年来在全球范围内受到了广泛的关注和追捧。它不仅语法简单明了,易于上手,而且拥有强大的第三方库和广泛的应用领域。从数据分析、机器学习到Web开发,Python都能发挥出色的性能&am…

算法题 - 双指针

目录 125. 验证回文串392. 判断子序列167. 两数之和 Ⅱ - 输入有序数组11. 盛最多的水15. 三数之和 125. 验证回文串 LeetCode_link 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 …

面相对象设计

设计原则 创建性模式 结构性模式 行为模式

C++11 设计模式3. 工厂方法模式

简单工厂模式的遗留问题 //从上面的代码可以看到,简单工厂模式确实实现了new 出来具体对象, 和 业务逻辑的分离, //但是不符合 "开闭原则" //"开闭原则"说的是代码扩展性问题——对扩展开放,对修改关…

算法设计与分析实验报告c++实现(TSP问题、哈夫曼编码问题、顾客安排问题、最小生成树问题、图着色问题)

一、实验目的 1.加深学生对贪心算法设计方法的基本思想、基本步骤、基本方法的理解与掌握; 2.提高学生利用课堂所学知识解决实际问题的能力; 3.提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 用贪心算…

C# 两种方法截取活动窗口屏幕,实现窗体截图

方法1,截屏内容仅包括活动窗口界面,而方法2是从屏幕范围取图,截屏内容会包括屏幕上所有内容。例如有一些程序在桌面顶层显示半透明的悬浮窗,用方法2截屏就会包括这些内容,并不是单纯的活动窗口内容。 方法1&#xff0c…

开源代码分享(19)-配电网孤岛优化划分方法

参考文献: DING Tao, LIN Yanling, LI Gengfeng, et al. A new model for resilient distribution systems by microgrids formation[J]. IEEE Transactions on Power Systems, 2017, 32(5): 4145-4147. 1.基本原理 通过分布式电源(DGs)形…

蓝桥杯 前一晚总结 模板 新手版

《准备实足&#xff0c;冲冲冲 省一》https://www.yuque.com/lenyan-svokd/hi7hp2/hfka297matrtsxy2?singleDoc# 《准备实足&#xff0c;冲冲冲 省一》 #include<bits/stdc.h> // 包含标准库头文件using namespace std; using ll long long; // 定义 long long 数据类…

218基于matlab的有限差分法求解泊松方程

基于matlab的有限差分法求解泊松方程&#xff0c;采用SOR超松弛迭代法。模型采用方形区域&#xff0c;划分网格数为100*100&#xff0c;网格数可以很方便的更改。程序已调通&#xff0c;可直接运行。 218有限差分法 泊松方程 SOR超松弛迭代法 - 小红书 (xiaohongshu.com)

基于React封装Handsontable并兼容antd

背景 其实Handsontable官方也提供了React的版本&#xff0c;但是官方的版本再编辑和渲染的时候并不能够很好的嵌入第三方的组件库。这就导致了&#xff0c;使用了Handsontable就没有办和普通的react项目一样轻松引用其他第三方组件。因此对其react的版本进行了二次的封装&#…

定制个性化的 openEuler 系统镜像:打造独特的安装体验

前言 标准的操作系统镜像可能无法完全满足特定用户群体或特定应用场景的需求。通过定制化&#xff0c;可以根据具体需求预装特定软件、配置特定网络设置&#xff0c;甚至设置特定的用户权限&#xff0c;以确保系统能够满足用户的需求。定制化系统镜像可以优化安装流程&#xf…

PandasAI的应用与实战解析(二):PandasAI使用流程与功能介绍

文章目录 1.使用PandasAI进行开发的流程2.配置文件解析3.支持的数据库类型4.支持的LLMs5.其他 PandasAI这个工具最突出的优点就是通过结合了Pandas和生成式LLMs&#xff0c;极大地为开发人员降低了工作量。 传统的开发调用流程&#xff08;数据分析相关&#xff09;&#xff1a…

(UDP)其他信息: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。

“System.Net.Sockets.SocketException”类型的异常在 mscorlib.dll 中发生&#xff0c;但未在用户代码中进行处理其他信息: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。这个异常表示端口已经被占用了&#xff0c;需要释放端口或者使用其他端口来建立连接。您可以…

CLion 2024:为Mac与Win打造的卓越跨平台集成开发环境

CLion 2024作为一款跨平台IDE&#xff0c;CLion 2024不仅完美支持Mac和Windows两大操作系统&#xff0c;更在细节之处展现了其出色的跨平台兼容性。无论你是在Mac的优雅界面下工作&#xff0c;还是在Windows的实用环境中编程&#xff0c;CLion 2024都能为你提供一致且流畅的开发…

如何使用 Grafana 监控文件系统状态

当 JuiceFS 文件系统部署完成并投入生产环境&#xff0c;接下来就需要着手解决一个非常重要的问题 —— 如何实时监控它的运行状态&#xff1f;毕竟&#xff0c;它可能正在为关键的业务应用或容器工作负载提供持久化存储支持&#xff0c;任何小小的故障或性能下降都可能造成不利…

ES6: set和map数据结构以及使用场景

ES6:set和map数据结构 一、Set 数据结构&#xff1a;二、使用场景&#xff1a;使用Set 进行去重三、Map 数据结构四、使用场景&#xff1a;使用Map进行树型数据懒加载刷新五、Set和Map的区别六、Map、Set的实际使用场景 Set 和 Map 是 ES6 中引入的两种新的数据结构&#xff0c…

设计模式代码实战-装饰者模式

1、问题描述 小明喜欢品尝不同口味的咖啡&#xff0c;他发现每种咖啡都可以加入不同的调料&#xff0c;比如牛奶、糖和巧克力。他决定使用装饰者模式制作自己喜欢的咖啡。 请设计一个简单的咖啡制作系统&#xff0c;使用装饰者模式为咖啡添加不同的调料。系统支持两种咖啡类型…

ANSYS Electromagnetics Suite 2023 R2 三维电磁(EM)仿真软件下载

Ansys家最新的三维电磁&#xff08;EM&#xff09;仿真软件ANSYS Electromagnetics Suite 2023 R2日前发布了&#xff0c;老wu这次分享得有点晚 &#xffe3;ω&#xffe3;&#xff0c;现在已经将资源上传到了网盘供大家免费下载&#xff0c;同时&#xff0c;为了让大家都能与…

企业航拍VR全景视频展示仿如上门参观

360度VR全景视频因其广阔的视野和身临其境的体验&#xff0c;无论再房产楼盘的精致呈现&#xff0c;旅游景点的全景漫游&#xff0c;还是校园风光的生动展示&#xff0c;都成为企业商户的首选。 360度vr全景视频编辑软件是深圳VR公司华锐视点提供多种常见的三维仿真场景供选择&…