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删了,这个时候,由于不符合框架的规则了,就会导致参数无法匹配上。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iview4.x中实现表格列拖拽|左右拖动|点击标题移动|iview拖拽后数据变化但是标题未变

1、sortablejs npm install sortablejs --save 2、引入 import Sortable from sortablejs 3、 mounted mounted() { this.columnDrop() }, 4、mothods columnDrop() { let tbody document.querySelector(.ivu-table-header tr) let _this this Sortable.create(tbody, { onEn…

粉笔精品班面试笔记(一)

1.社会现象 审题方法 1、审设问剖析问法,明确作答重点 2、审题干明确核心,判断现象性质 解题思路 提观点:基本看法 重分析: 正面现象,意义——好上加好 负面现象,危害、原因——解决问 抓落实&#xff…

FASTAPI系列 20-异常处理器exception_handler

FASTAPI系列 20-异常处理器exception_handler 文章目录 FASTAPI系列 20-异常处理器exception_handler前言一、HTTPException 异常?二、覆盖默认的HTTPException 异常三、覆盖请求验证异常RequestValidationError 源码分析 总结更多内容,请关注公众号 前言…

GET与POST:详述HTTP两大请求方法的语义、数据处理机制、安全特性与适用场景

GET和POST方法在HTTP请求中具有明确的角色分工和特性差异。GET适用于读取操作和不敏感数据的传递,强调可缓存性和安全性,而POST适用于写入操作和敏感数据的提交,提供了更大的数据承载能力和更强的隐私保护。本文详细介绍了GET与POST请求方法的…

多张固定宽度元素,随着屏幕尺寸变化自动换行

背景&#xff1a;多张固定宽度元素&#xff0c;随着屏幕尺寸变化自动换行实现&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevic…

多协议接入视频汇聚EasyCVR平台vs.RTSP安防视频EasyNVR平台:设备分组的区别

EasyCVR视频融合云平台则是旭帆科技TSINGSEE青犀旗下支持多协议接入的视频汇聚融合共享智能平台。平台可支持的接入协议比EasyNVR丰富&#xff0c;包括主流标准协议&#xff0c;有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海…

MySQL与Navicat相关

mysql中find_in_set的用法&#xff1f; FIND_IN_SET 是 MySQL 中的一个函数&#xff0c;用于在逗号分隔的字符串列表中查找指定值&#xff0c;并返回其在列表中的位置&#xff08;索引&#xff09;&#xff0c;如果找不到则返回 0。其语法如下&#xff1a; FIND_IN_SET(searc…

强行让Java和Go对比一波[持续更新2024-04-10已更新]

概述 很多Java开发如果想转Golang的话&#xff0c;比较让Java开发蛋疼的第一是语法&#xff0c;第二是一些思想和设计哲学的Gap&#xff0c;所以我这儿强行整理一波Java和Golang的对比&#xff0c;但是由于GO和Java在很多方面都有不同的设计&#xff0c;所以这些对比的项可以更…

Java 集合Collection

集合的体系 Collection的结构体系 List系列集合&#xff1a;添加的元素是有序的、可重复、有索引。Set系列集合&#xff1a;无序、不重复、无索引 HashSet&#xff1a;无序、不重复、无索引LinkedHashSet:有序、不重复、无索引TreeSet&#xff1a;按照大小默认升序排序、不重复…

VueRouter使用,界面切换

一、安装 vue-router3&#xff0c;4分别对应vue2&#xff0c;3.。我现在用的是vue2&#xff0c; npm install vue-router3二、使用 ①首先在component路径下提前写好需要渲染的组件。 ②在App.vue中使用router声明路由。其中router-link的to指明渲染哪一个组件。router-view…

类与对象\友元

最前面加上关键字 friend友元是单向的&#xff0c;不具有交换性 实现互访需要两个类都将对方声明为自己的友元类 友元关系不具备传递性使用友元可以避免频繁调用类的接口函数&#xff0c;提高效率&#xff0c;节省开销 3种形式 友元函数&#xff1a;不属于任何类的普通函数友…

SpringBoot项目在yml或者properties文件中使用环境变量

在 application.yml 或者 application.properties 值的位置随便写这样的语法就可以替换文本 ${MYSQL_URL:192.168.0.100}比如 datasource:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://${MYSQL_URL:192.168.0.10…

​智己舆论战完败

阅读本文大概需要 1.41 分钟 智己汽车跟小米汽车双方在社交媒体上的交锋&#xff0c;想必大家这两天应该有所耳闻&#xff0c;具体情况是这样的&#xff1a;智己发布新车 L6&#xff0c;对标小米 SU7&#xff0c;其中有一项对小米 SU7 的参数标注错误。于是小米发文要求其道歉&…

cmd输出日期及格式

编写Windows批处理时经常会需要使用到日期和时间作为文件名&#xff0c;详解如下&#xff1a; 1.获取日期 格式&#xff1a; %date% 结果&#xff1a; 2022-07-31 2.获取时间 格式&#xff1a; %time% 结果&#xff1a; 10:21:21.68 3.获取日期和时间 格式&#xff1a;…

grid布局不确定x轴或者y轴具体有多少行,但是宽高是固定的

在CSS Grid布局中&#xff0c;即使你不确定x轴&#xff08;列&#xff09;或y轴&#xff08;行&#xff09;上具体有多少元素&#xff0c;你仍然可以通过设置固定的宽度和高度来定义网格。如果你想要创建一个固定宽高的网格&#xff0c;但不确定具体的行数或列数&#xff0c;你…

huggingface无法下载模型的问题解决

OpenDevin里面的embedding模型需要从huggingface下载&#xff0c;但是连不上&#xff0c;怎么办呢&#xff1f; 以前碰到连不上&#xff0c;就放弃了&#xff0c;所以很长时间没有用过huggingface。这回OpenDevin这个软件太牛了&#xff0c;激励着我把这个这个问题解决。 从网…

从零开始学Spring Boot系列-SpringApplication

SpringApplication类提供了一种从main()方法启动Spring应用的便捷方式。在很多情况下&#xff0c; 你只需委托给 SpringApplication.run这个静态方法 &#xff1a; SpringBootApplicationpublic class SpringbootLearningApplication {public static void main(String[] args) …

【MYSQL锁】透彻地理解MYSQL锁

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 目录 1.锁 1.1 概述 1.2 全局锁 1.2.1 语法 1.2.1.1 加全局锁 1.2.1.2 数据备份 1.2.1.3 释放锁 1.2.1.4 特点 1.2.1.5 演示 1.3 表级锁 1.3.1 介绍 …

HTTP与HTTPS:深度解析两种网络协议的工作原理、安全机制、性能影响与现代Web应用中的重要角色

HTTP (HyperText Transfer Protocol) 和 HTTPS (Hypertext Transfer Protocol Secure) 是互联网通信中不可或缺的两种协议&#xff0c;它们共同支撑了全球范围内的Web内容传输与交互。本文将深度解析HTTP与HTTPS的工作原理、安全机制、性能影响&#xff0c;并探讨它们在现代Web…

docker重启错误-重启命令一直卡住

docker重启错误-重启命令一直卡住 systemctl restart docker 卡住 未知原因&#xff1a;可能是启动的容器数量过多&#xff0c;或者磁盘IO问题 解决方式&#xff1a; systemctl start docker-cleanup.service systemctl start docker Docker是一种相对使用较简单的容器&#…