全国十大网站建设公司排名,网店怎么开视频教程,精准营销的典型案例,新网站建设服务因为最近在整理一些源码和编写规范#xff0c;这里写一下只是记录几年前自己遇到的问题#xff0c;好久都忘了#xff0c;还是写下来比较好。 问题记录#xff1a;由于变量使用了boolean#xff0c;并且变量名是is开头的#xff0c;由于java机制boolean默认是false#… 因为最近在整理一些源码和编写规范这里写一下只是记录几年前自己遇到的问题好久都忘了还是写下来比较好。 问题记录由于变量使用了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对参数做了序列化处理 接下来要看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这个变量值改为了booleanAis去哪里了呢 又是什么时候往【_properties】里面放参数的呢 _properties放值的时候是在BeanDeserializerFactory中的addBeanProps方法中进行的最下面有个builder.addProperty(prop);调用了BeanDeserializerBuilder类的addProperty方法往里面设的值 而循环用的propDefs参数来自于这里对入参参数beanDesc.findProperties()进行了特殊处理然后得到的 中间省略一万字直接找beanDesc这个参数是从哪里得到的如下所示在这里创建的 com.fasterxml.jackson.databind.deser.DeserializerCache#_createDeserializercom.fasterxml.jackson.databind.introspect.BasicClassIntrospector#_findStdTypeDesc这个方法是转换基础数据类型的实体的话是null会走得下面的if中在collectProperties方法中做了处理 这里解析出来了get set方法的前缀是什么 后面继续省略直接看核心逻辑直接定位到这里找他什么时候用反射把数据填进去的嵌套了一堆烦死了找了半天而且版本也不一样了之前我都是直接搜coll方法就有现在还得从新跟源码 终于找到了这个方法原先是coll()因为我框架版本升级了变成collectAll()了 一直到这里其实都是有的但是后面有个remove给删了就是这个方法没有匹配的数据给删了 框架都是基于反射的属性的获取和设置都是基于他的get set方法有些框架或者使用idea的自动生成get set都会有一些对参数的特殊处理比如boolean的is开头参数会自动把你的is删了这个时候由于不符合框架的规则了就会导致参数无法匹配上。 网上一大堆说怎么处理的根本原因其实在这里万物基于反射~~~