为什么不推荐使用Lombok?@Data不香吗?

这篇具有很好参考价值的文章主要介绍了为什么不推荐使用Lombok?@Data不香吗?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、前言

二、源码跟踪

三、总结


一、前言

之前写项目遇到的一个Bug,下面是模拟代码。

新建一个springboot的项目,Person一个实体类,定义一个方法传一个JSON数据

@Data
public class Person {
    private String name;
    private String aName;
    private String aaName;
}
@SpringBootApplication
@RestController
public class LombokTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(LombokTestApplication.class, args);
    }

    @PostMapping("/user")
    public String userSearch(@RequestBody Person person){
        System.out.println(person);
        return "okk~";
    }

}

springboot启动之后postman发送一次请求。

请求路径:http://localhost:8080/user

JSON数据:

{
    "name": "aaa",
    "aName": "bbb",
    "aaName": "ccc"
}

后台输出结果

为什么不推荐使用Lombok?@Data不香吗?,报错日常,java,spring boot,开发语言

我们会发现,aName字段为null?居然接收不了,而aaName可以接受,这是为什么呢?

二、源码跟踪

分析这个源码要对SpringMVC框架有一定的理解,它的最基础的请求处理也是基于原生的servlet去进行了一个扩展,它扩展的一个核心叫做 DispatcherServlet ,它的所有的http请求都会去走 doDispatch 这个方法。

为什么不推荐使用Lombok?@Data不香吗?,报错日常,java,spring boot,开发语言

在大概540行左右的handle,这里在调用,我们关注的是 为什么那个aName参数它没有解析出来,后面执行会调用 InvocableHandlerMethod 里面的 getMethodArgumentValues 方法。

为什么不推荐使用Lombok?@Data不香吗?,报错日常,java,spring boot,开发语言

在方法的return部分我们打了个断点,看看会返回啥?

为什么不推荐使用Lombok?@Data不香吗?,报错日常,java,spring boot,开发语言

发现这个方法返回就使aName变成了null(这里就已经完成了参数解析了,说明问题出在这一块)。

然后进过一系列的操作,我们最终来到了 POJOPropertiesCollector 的 collectAll 这个方法,我们在 _addFields 与 _addMethods 打个断点。

为什么不推荐使用Lombok?@Data不香吗?,报错日常,java,spring boot,开发语言

跑一下,在_addFields他的size为0,我们再来看看_addMethods,它的size为3。

为什么不推荐使用Lombok?@Data不香吗?,报错日常,java,spring boot,开发语言

我们点击下一步(不是下一个断点)发现他的长度变成了4了,而且还多了个aname的字段

为什么不推荐使用Lombok?@Data不香吗?,报错日常,java,spring boot,开发语言

按住ctrl键点击_addMethods我们进去看看,这个方法填加了一个字段。

    protected void _addMethods(Map<String, POJOPropertyBuilder> props) {
        Iterator var2 = this._classDef.memberMethods().iterator();

        while(var2.hasNext()) {
            AnnotatedMethod m = (AnnotatedMethod)var2.next();
            int argCount = m.getParameterCount();
            if (argCount == 0) {
                this._addGetterMethod(props, m, this._annotationIntrospector);
            } else if (argCount == 1) {
                this._addSetterMethod(props, m, this._annotationIntrospector);
            } else if (argCount == 2 && Boolean.TRUE.equals(this._annotationIntrospector.hasAnySetter(m))) {
                if (this._anySetters == null) {
                    this._anySetters = new LinkedList();
                }

                this._anySetters.add(m);
            }
        }

    }

我们再点击下一步,一直到_removeUnwantedAccessor这个,发现size变成3了,这里就删除了我们的aName字段,保留了aname,这就是问题的关键了。

为什么不推荐使用Lombok?@Data不香吗?,报错日常,java,spring boot,开发语言

这里我们要看看这个@Data到底生成了什么东西,我们在终端敲入命令:mvn clean package

为什么不推荐使用Lombok?@Data不香吗?,报错日常,java,spring boot,开发语言

我们看看反编译出来的到底是个啥?

为什么不推荐使用Lombok?@Data不香吗?,报错日常,java,spring boot,开发语言

左边是手动生成的get set 方法,右边是@Data 生成的,我们发现了自己生成的 getaName 它的a是小写的,而@Data生成的getAName的A是大写的。

为什么不推荐使用Lombok?@Data不香吗?,报错日常,java,spring boot,开发语言

而getAName可能反推出aName和aname两个可能,所以在_removeUnwantedAccessor这里就删除了aName这个字段,就后台接受不到了。

三、总结

这个bug虽然不算什么,但是这也是个细节,虽然像aName这种不规范的命名字段很少用,但是这里模拟当初项目的出错,这里还是建议大家使用手动或者快捷键生成的实体类的方法(当然不是Lombok不好用,它也有它的优点)文章来源地址https://www.toymoban.com/news/detail-708599.html

到了这里,关于为什么不推荐使用Lombok?@Data不香吗?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue3为什么推荐使用ref而不是reactive

    reactive 本身具有很大局限性导致使用过程需要额外注意,如果忽视这些问题将对开发造成不小的麻烦;ref更像是vue2时代 option api 的 data 的替代,可以存放任何数据类型,而 reactive 声明的数据类型只能是对象; 先抛出结论,再详细说原因:非必要不用 reactive ! (官方文档也有对应的推荐

    2024年02月07日
    浏览(45)
  • 【密码学】为什么不推荐在对称加密中使用CBC工作模式

    这篇文章是我在公司内部分享中一部分内容的详细版本,如标题所言,我会通过文字、代码示例、带你完整的搞懂为什么我们不建议你使用cbc加密模式,用了会导致什么安全问题,即使一定要用需要注意哪些方面的内容。 注:本文仅从安全角度出发,未考虑性能与兼容性等因

    2024年02月06日
    浏览(73)
  • 为什么Spring和IDEA不推荐使用@Autowired注解,有哪些替代方案?

    在使用Spring框架和JetBrains IDEA集成开发环境(IDE)进行Java开发时,你可能经常会遇到@Autowired注解。@Autowired是Spring框架中用于实现依赖注入的核心注解之一。然而,近年来,Spring和IDEA都不再推荐使用@Autowired注解,并提出了更好的替代方案。本文将详细分析为什么Spring和IDEA不

    2024年02月07日
    浏览(62)
  • 为什么我不再推荐枚举策略模式

    一、为什么讲策略模式 二、经典策略模式 三、基于枚举的策略模式 四、基于工厂的策略模式 策略模式,应该是工作中比较常用的设计模式,调用方自己选择用哪一种策略完成对数据的操作,也就是“一个类的行为或其算法可以在运行时更改” 我个人的理解是 将一些除了过

    2024年02月07日
    浏览(45)
  • 为什么axios会有params和data两个参数

    不知道大家有没有过这种感觉,突然一个问题百思不得其解,然后突然有一天就明白了。然后就感觉这个问题原来这么简单,本来想记录下来,但是又感觉这么简单的问题记录下来没啥意义。但是回过头来想一想,这个问题之前其实困扰了你很长时间。感觉还是记录一下比较

    2024年02月08日
    浏览(51)
  • 记录--为什么推荐用svg而不用icon?

    使用背景: 1.因为svg图标在任何设备下都可以高清显示,不会模糊。而icon会在显卡比较低的电脑上有显示模糊的情况 2.svg图标在页面render时 速度会比icon稍微快一点 3.实现小程序换肤功能 ;方案见:www.yuque.com/lufeilizhix… SVG基础可参考:www.yuque.com/lufeilizhix… inline svg是目前前

    2024年02月08日
    浏览(52)
  • 为什么不推荐在头文件中直接定义函数?

    在C++中,函数的分文件编写是一种让代码结构更加清晰的方法,通常可以分为以下几个步骤: 创建后缀名为 .h 的头文件,在头文件中写函数的声明,以及可能用到的其他头文件或命名空间 创建后缀名为 .cpp 的源文件,在源文件中写函数的定义,同时引入自定义头文件,将头

    2024年02月16日
    浏览(51)
  • 编程开发8大语言详解,为什么Java是我最推荐的?

    很多没有接触过编程语言的同学,都会觉得编程开发特别高端和神奇,担心理解不了更担心学不会。 当然,也有人会认为,你既然是做编程的,那么你应该什么都会,什么软件的开发都能完成,这是平哥经常听到的两种声音。 在此,平哥需要给大家科普一下, 编程确实改变

    2024年02月05日
    浏览(73)
  • 为什么我不推荐学Python去找工作?为什么只会Python很难找到工作?在职程序员聊聊Python岗位的一些情况

    有很多小伙伴私信和我交流的时候 就说就他说他想学Python 想问问我的意见 不得不说 就是拍子现在应该是是目前 比较热门的一个种语言 这个确实是 但是热门呢 他就不一定意味着一定好找工作 我自己也很喜欢Python 在我心里呢 我是把Python 当做这一种辅助语言来使用 因为有时

    2024年02月03日
    浏览(64)
  • Spring和IDEA都不推荐用的@Autowired注解,为什么还有那么多人用?

    @Autowired的默认装配 我们都知道在spring中@Autowired注解,是用来自动装配对象的。通常,我们在项目中是这样用的: 没错,这样是能够装配成功的,因为默认情况下spring是按照类型装配的,也就是我们所说的byType方式。 此外,@Autowired注解的required参数默认是true,表示开启自动

    2023年04月18日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包