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.hqwc.cn/news/615134.html

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

相关文章

变量---

一、变量概述 1、什么是变量 变量是用于存放数据的容器。通过变量名 获取数据,甚至数据可以修改。 变量的本质:变量是程序在内存中申请的一块用来存放数据的空间。 二、变量的使用 变量在使用时分两步:1、声明变量 2、赋值 三、变量语法…

【回溯】Leetcode 51. N 皇后【困难】

N 皇后 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。…

2024年第十四届MathorCup数学应用挑战赛B题解题思路

B题https://mbd.pub/o/bread/ZZ6Wm5dx 问题1:对于附件I(Pre_test文件夹)给定的三张甲骨文原始拓片图 片进行图像预处理,提取图像特征,建立甲骨文图像预处理模型,实现对 甲骨文图像干扰元素的初步判别和处理。 针对问题1,对于附件…

vue源码解析——v-if和v-for哪个优先级高,如何避免两者同时使用

首先,官方不推荐v-if和v-for在同一个元素上使用。其次,如果两者同时使用,v-if和v-for的优先级怎么确定?在vue2和vue3中这两者的优先级顺序不一样。vue2是v-for优先,条件不存在时也会渲染多个注释节点。在vue3中进行了改…

Android - 安卓概述

什么是安卓? Android 是一种基于 Linux 的开源操作系统,适用于智能手机和平板电脑等移动设备。 Android 是由 Google 和其他公司领导的 Open Handset Alliance 开发的。 Android 为移动设备的应用程序开发提供了统一的方法,这意味着开发人员只需为 And…

多模块项目使用springboot框架进行业务处理

项目目录 1、在Result定义返回结果 package com.edu.result;import lombok.Data;import java.io.Serializable;/*** 后端统一返回结果* param <T>*/ Data public class Result<T> implements Serializable {private Integer code; //编码&#xff1a;1成功&#xf…

聚酰亚胺PI材料难于粘接,用什么胶水粘接?那么让我们先一步步的从认识它开始(二十五): 聚酰亚胺光敏PI(PSPI)

聚酰亚胺光敏PI&#xff08;PSPI&#xff09; 聚酰亚胺光敏PI&#xff08;PSPI&#xff09;是一种结合了聚酰亚胺&#xff08;PI&#xff09;的优良物理和化学性能以及光敏材料特性的高端有机材料。在高分子链上&#xff0c;它兼有亚胺环和光敏基因&#xff0c;因此具有优异的热…

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

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

防火墙操作!

当小编在Linux服务器上部署好程序以后&#xff0c;但是输入URL出现下述情况&#xff0c;原来是防火墙的原因&#xff01;&#xff01; 下面是一些防火墙操作&#xff01; 为保证系统安全&#xff0c;服务器的防火墙不建议关闭&#xff01;&#xff01; 但是&#xff0c;我们可…

免费ssl证书能一直续签吗?如何获取SSL免费证书?

免费SSL证书是否可以一直续签。我们需要了解SSL证书的基本工作原理。当你访问一个使用HTTPS协议的网站时&#xff0c;该网站实际上在使用一个SSL证书。这个证书相当于一个数字身份证明&#xff0c;它验证了网站的真实性和安全性。而这个证明是由受信任的第三方机构——通常是证…

RestTemplate—微服务远程调用—案例解析

简介&#xff1a;总结来说&#xff0c;微服务之间的调用方式有多种&#xff0c;选择哪种方式取决于具体的业务需求、技术栈和架构设计。RESTful API和HTTP客户端是常见的选择&#xff0c;而Feign和Ribbon等辅助库可以简化调用过程。RPC和消息队列适用于特定的场景&#xff0c;如…

kail渗透工具之nmap的使用方法

准备工作&#xff1a;开启两台虚拟机和一台Windows主机 kail Linux攻击机&#xff1a;192.168.80.131 red hat靶机&#xff1a;192.168.80.129 Windows主机&#xff1a;192.168.252.42 1、nmap扫描工具的简介 nmap是用来探测计算机网络上的主机和服务的一种安全扫描器。为了绘…