lombok 的bug?lombok 导致 springmvc 使用 @RequestBody注解 接收 json数据 对象参数绑定失败

大家好,我是烤鸭:
    lombok 导致 springmvc 使用 @RequestBody注解 接收 json数据 对象参数绑定失败。
    环境版本:
        spring 5.x

1. 场景复现


    问题出现在创建对象的属性名称。比如我有一个类中的属性值是 
    String aTest;

    首字母小写,第二个字母大写。
    lombok 生成的get/set 方法是 getATest/setATest。
    而依据java的规范(用各种ide生成的get/set方法) 应该是 getaTest/setaTest。

2. 问题猜测

    lombok 生成的方法不符合 JavaBean get/set 规范,导致mvc 无法封装进入对象。
    尝试 form表单提交的方式 是没有问题的。
    问题在于json 的方式。或者说在于json序列化和反序列化时。
    spring json的包 默认使用的 com.fasterxml.jackson
    可以看一下 com.fasterxml.jackson.databind.deser.impl.BeanPropertyMap
    的 _findWithAlias 方法,如图:

    BeanPropertyMap 获取到类中的属性是 atest,而前台传入的key是 aTest,无法匹配。
    将 前台传参改为

  {"atest":"1","age":"2"}

  就可以匹配上了。

3.解决


    不使用lombok 或者 重写 get/set方法
    或者 不使用 com.fasterxml.jackson 序列化,使用 fastjson

    看下有人提出过issue,而作者也提出了解决办法。
    https://github.com/rzwitserloot/lombok/issues/1661
    

    

4.深入源码看一下


    首先分析一下 com.fasterxml.jackson。

    org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver

    

protected <T> Object readWithMessageConverters(HttpInputMessage inputMessage, MethodParameter parameter,Type targetType) throws IOException, HttpMediaTypeNotSupportedException, HttpMessageNotReadableException {// ... 省略// 关键点部分 1 	 body = (genericConverter != null ? genericConverter.read(targetType, contextClass, msgToUse) :((HttpMessageConverter<T>) converter).read(targtestlass, msgToUse));// ... 省略
}			

后边调用的就是  BeanPropertyMap 的find 方法。

    再看一下 com.alibaba.fastjson
    通过修改 默认 json解析器。原来 AbstractJackson2HttpMessageConverter  改为  FastJsonHttpMessageConverter
    com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer
    的 deserialze 方法。
    可以看到 fastjson 将原来的属性 放到 fieldinfo 中。后续操作的的都是fieldinfo 对象。

  

5. 测试


前面写的还不够清晰,我们可以写个简单的test方法自己测一下。

ATest.java

package com.test.test.test;import lombok.Data;@Data
public class ATest{String aTest;String age;}

TestJson.java

package com.test.test;import com.alibaba.fastjson.JSONObject;
import com.test.controller.test.ATest;
import org.junit.Test;import java.util.HashMap;public class TestJson{@Testpublic void testJson() {HashMap<Object, Object> hashMap = new HashMap<>();hashMap.put("aTest","111");hashMap.put("age","111");ATest test = JSONObject.parseObject(JSONObject.toJSONString(hashMap), ATest.class);System.out.println("fastjson=================="+test);ATest o = (ATest) net.sf.json.JSONObject.toBean(net.sf.json.JSONObject.fromObject(hashMap), ATest.class);System.out.println("net.sf.json=================="+o);}
}

可以发现,fastjson 反序列化话的对象是正常的。
net.sf.json 是不行的。
net.sf.json 使用的是 org.apache.commons.beanutils.PropertyUtilsBean
getPropertyDescriptors 
beanInfo.getPropertyDescriptors();
可以看到获取到的 beanInfo 的 propertyName 是 ATest。

事实证明, lombok  这波操作确实有点问题,起码不兼容市面上大部分的json包。


总结:


最开始以为是mvc 无法封装 的问题,后来发现跟lombok有关(首字母小写、第二个字母大写时的get/set方法生成方式)
form表单提交没问题,发现跟json有关(序列化/反序列化)
再换了几个常见的json包。
fastjson 没问题,net.sf.json 和 jackson 都不行
lombok 这波操作就是逆规范的,没什么好说的。如果非要这种命名的话,建议重写get/set 方法。

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

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

相关文章

[css] 说说你对min-width和max-width的理解,它们有什么运用场景?

[css] 说说你对min-width和max-width的理解&#xff0c;它们有什么运用场景&#xff1f; min-width和max-width可以使得自适应布局保持一个基本的样式。 用于多列布局时候&#xff0c;可以保证某几列的布局保持在一定的范围内。 比较常见的应用应该是网站首页的三栏布局类型&a…

web APIS

WEB API系列&#xff1a; 很多人都很迷惑&#xff0c;既然有了WCF为什么还要有WEB API&#xff1f;WEB API会不会取代WCF&#xff1f; 就我的看法&#xff0c;WCF提供的是一种RPC实现的集合&#xff0c;WCF的设计更多地考虑了SOA的场景&#xff0c;以及各种RPC的问题。很多人也…

[css] 说说你对hasLayout的理解,触发hasLayout的方式有哪些?

[css] 说说你对hasLayout的理解&#xff0c;触发hasLayout的方式有哪些&#xff1f; hasLayout可理解为是IE7以及更旧版本的BFC。 跟BFC一样&#xff0c;hasLayout不能直接通过属性进行设置&#xff0c;而是需要一定的触发条件。具体条件可在进行向下兼容时再查阅相关资料&…

【mysql分区分表】mysql 按时间分区 【partition】

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一下有关 mysql 分区。 需求&#xff1a; 按时间分区。 对千万数据左右的表&#xff0c;进行分区&#xff0c;数据的增加量大概千万/年。 代码实现&#xff1a; 模拟之前已经存在的表&#xff1a; DROP TABLE IF EXISTS…

NOIp2018滚粗记

小蒟蒻chd在NOIp2018成功滚粗&#xff0c;下面向大家分享一下我的滚粗经验。 &#xff08;CCF竟然把老爷机给换了&#xff09; Day0 没什么好写的&#xff0c;反正就和平时一样。 Day1 早上6:50才起床&#xff0c;赶在7:20之前上了车&#xff0c;长沙理工大真的远&#xff0c;坐…

[css] 什么是zoom?它有什么作用?

[css] 什么是zoom&#xff1f;它有什么作用&#xff1f; zoom 最初是 IE 的私有属性&#xff0c;现在除了 Firefox 之外的浏览器基本都支持 zoom。不过&#xff0c;zoom 依旧不是正式的属性。与之对应的 transform 的 scale 属性是正式的 CSS 属性。zoom 主要的作用是用于元素…

【dubbo】http.conn.HttpHostConnectException.host: 'org.apache.http.HttpHost' could not be instantiated

大家好&#xff0c;我是烤鸭&#xff1a; dubbo遇到如下问题。 1. 异常详细信息&#xff1a; 某个异常对象无法实例化。 com.alibaba.dubbo.rpc.RpcException: Failed to invoke remote method: updateCardBycustomerNum, provider: dubbo://20.x.xx.48:20883/com.etc.servi…

2018 ACM-ICPC青岛现场赛 B题 Kawa Exam 题解 ZOJ 4059

题意&#xff1a;BaoBao正在进行在线考试&#xff08;都是选择题&#xff09;&#xff0c;每个题都有唯一的一个正确答案&#xff0c;但是考试系统有m个bug(就是有m个限制)&#xff0c;每个bug表示为第u个问题和第v个问题你必须选择相同的选项&#xff0c;题目问你&#xff0c;…

[css] 举例说明微信端兼容问题有哪些?

[css] 举例说明微信端兼容问题有哪些&#xff1f; 说一个微信小程序的iPhoneX适配吧&#xff0c; 因为iPhoneX底部没有虚拟按键&#xff0c;底部的横线会出现遮挡这时候就要处理下&#xff1a; 大概思路就是获取到客户端设备&#xff0c;然后判断是iPhoneX就换样式。 在app.js…

多线程创建方式 线程池、Future和CompletableFuture

大家好&#xff0c;我是烤鸭&#xff1a; 今天说一下 多线程的几种创建方式及使用。 1. Thread 和 Runnable 继承 Thread 类 和实现 Runnable 接口。 这种就不举例子了。 2.线程池 现在主要有5种线程池。 //缓存线程池ExecutorService cachedThreadPool Executors.newCa…

[css] 你有没有自己写过一套UI库?说下遇到哪些难点?

[css] 你有没有自己写过一套UI库&#xff1f;说下遇到哪些难点&#xff1f; 维护过&#xff0c;碰到的坑主要是 1&#xff09;同一个UI component在不同地方使用的customization问题。 2&#xff09;还有如果UI component如果有bug的话会导致所有使用的地方都出现bug 3&#x…

权限设计文章汇总

如何设计网站权限系统&#xff1f; https://www.zhihu.com/question/20313385/answer/118095995 我的转载&#xff1a;https://www.cnblogs.com/hao-1234-1234/p/9850967.html 应用程序权限设计 http://www.cnblogs.com/yukaizhao/archive/2007/04/15/user_role_action_permiss…

dubbo 整合 zipkin,最简单的方式,亲测有效

大家好&#xff0c;我是烤鸭。 之前也试过网上很多版本&#xff0c;看了好多文章。现在分享最简单的方式&#xff0c;代码侵入性最小的。 1. 修改pom,引入jar。 <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency><…

[css] 说说你对GPU的理解,举例说明哪些元素能触发GPU硬件加速?

[css] 说说你对GPU的理解&#xff0c;举例说明哪些元素能触发GPU硬件加速&#xff1f; GPU: 图形处理器,用于处理图形有关的任务,用于渲染页面在css中使用 transform: translateZ(0),可以开启GPU硬件加速个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容…

@Retention 注解的作用

注解Retention可以用来修饰注解&#xff0c;是注解的注解&#xff0c;称为元注解。Retention注解有一个属性value&#xff0c;是RetentionPolicy类型的&#xff0c;Enum RetentionPolicy是一个枚举类型&#xff0c;这个枚举决定了Retention注解应该如何去保持&#xff0c;也可理…

fastjson 1.2 版本之前的bug, 反序列化时自动排序,导致签名不过

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一个问题&#xff0c;使用fastjson 导致签名不过。 1. 问题复现&#xff1a; fastjson 1.2.4 获取返回值&#xff1a; {"data":[{"id":"120190422110857284042111114","bankAccountTyp…

[css] 你知道CSS中的字母“C“代表什么吗?

[css] 你知道CSS中的字母"C"代表什么吗&#xff1f; CSS(Cascading Style Sheets)。"C" 即为 Cascading 层叠的意思&#xff0c;我们编写 CSS 的时候&#xff0c;写在后面的样式会覆盖前面的样式即层叠。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流…

[Network Architecture]DPN(Dual Path Network)算法详解(转)

https://blog.csdn.net/u014380165/article/details/75676216 论文&#xff1a;Dual Path Networks 论文链接&#xff1a;https://arxiv.org/abs/1707.01629 代码&#xff1a;https://github.com/cypw/DPNs MXNet框架下可训练模型的DPN代码&#xff1a;https://github.com/m…

[css] 怎么自定义鼠标指针的图案?

[css] 怎么自定义鼠标指针的图案&#xff1f; cursor: url() ,auto url是自定义光标图案的绝对路径&#xff0c;auto是默认光标&#xff0c;当我们自定义的光标不起作用时&#xff0c;就用默认光标代替。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容…

javax.script.ScriptException: ReferenceError: xxx is not defined in eval

大家好&#xff0c;我是烤鸭&#xff1a; 今天使用 javax.script.ScriptEngine 遇到一个奇怪的问题&#xff0c;无法识别js方法。 1. 报错内容&#xff1a; javax.script.ScriptException: ReferenceError: "a" is not defined in <eval> at line number…