小心Lombok用法中的坑

刚才写完了代码,自测的时候,出现了NPE问题。

排查的时候发现是Lombok的坑,以前也遇到过,所以觉得有必要过来记录一下。

我先描述一下现象,我的代码里面订单服务A 需要调用缓存服务B,服务B就是一个Bean,使用方式是这样的:

class ServiceA {//使用 Lombok 提供的setter@Setterprivate ServiceB bXCacheService;public Data getData() {//这里出现了NPE问题bXCacheService.getSomeThing();} 
}

这个问题使用Lombok 的同学可能有人遇到过,我用的是蚂蚁的Sofa,Spring也是类似的,

先说下bean初始化过程,是通过反射,调用set 方法初始化bean,下面代码是我截取的部分代码:Spring 中的初始化bean方法

public void setValue(final Object object, Object valueToApply) throws Exception {//获取write方法,实际就是setXXX方法final Method writeMethod = this.pd.getWriteMethod();if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers()) && !writeMethod.isAccessible()) {if (System.getSecurityManager() != null) {AccessController.doPrivileged(new PrivilegedAction<Object>() {@Overridepublic Object run() {writeMethod.setAccessible(true);return null;}});} else {writeMethod.setAccessible(true);}}final Object value = valueToApply;if (System.getSecurityManager() != null) {} else {// 通过反射 用set 方法注入属性writeMethod.invoke(getWrappedInstance(), value);}
}

问题就出在 Sofa 拼接 bean 变量 set 方法的方式,例如:如果我们希望初始化的 bean 名称为 cacheService,那么 Sofa 拼接的 set 方法为 setCacheService,也就是set + 变量(首字母大写+剩余字符)。

但是如果 bean 名称是:tCacheService,bean 首字母小写,第二次字符是大写,那 set 方法就变成了:settCacheService,当第二个字符是大写的时候,set 不会设置变量 t 为大写 T。

但是 Lombok 不是这样,Lombok 的setter注解实现机制,会让 tCacheService 的 setter 方法变成 setTCacheService(), 所以bean初始化的时候会找不到 WriteMethod,bean注入失败,报NPE问题。

解决方法

解决方法要么调整bean的命名方式,不要让第二个字符是大写,要么改变这种变量不使用Lombok 注入,使用Idea / Eclipse 生成的setter 方法。

也算是Lombok 和 Idea 生成 setter 方法的区别,一般框架、中间件更偏向 Idea 的这种set 变量方式。

另一个需要注意的问题

还有一个不只是Lombok 要注意的点,就是boolean 类型的变量严禁使用 is 开头,因为无论是Lombok 还是Idea 默认生成的get 方法都是is打头,丢掉多余的is,set方法去掉is,可能引发非预期的问题,例如变量 boolean isOpen 和 变量 boolean open 变量的get方法名是一样的:isOpen(); set 方法都是 setOpen(boolean isOpen);

private boolean isOpen;public boolean isOpen() {return isOpen;
}public void setOpen(boolean open) {isOpen = open;
}

常规编程规范里面会让返回值是 boolean 变量的方法名以 is开头,但是变量本身不带is。

// 开火开关  -- 集中参数中心配置项
private String fireSwitch; public boolean isOpenFire() {return StringUtils.equalsIgnoreCase( "TRUE", fireSwitch);
}

455d2f22b07f8a7663a330435e8e59c0.gif

往期推荐

a3b86b3dae25c1cb40552b8a150d70fa.png

Java中List排序的3种方法!


6899ec4de88dafb22a105f69e1b7600b.png

面试官:元素排序Comparable和Comparator有什么区别?


8c6b3a5ca0a946888533c7c0d6663dcd.png

面试官:HashSet是如何保证元素不重复的?


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

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

相关文章

Java BigDecimal negate()方法与示例

BigDecimal类的negate()方法 (BigDecimal Class negate() method) Syntax: 句法&#xff1a; public BigDecimal negate();public BigDecimal negate(MathContext ma_co);negate() method is available in java.math package. negate()方法在java.math包中可用。 negate() met…

【VSCode】VSCode使用conda环境时找不到python包/找不到Module

这里写自定义目录标题0.问题描述1.原因2.解决方法0.问题描述 \qquad首先需要排除是否是VSCode未配置conda环境的问题&#xff0c;当然&#xff0c;相信VSCode的老粉都不会犯这个低级错误&#xff0c;请CtrlP&#xff0c;在搜索框>select interpreter检查一下python环境。 …

PS如何对JPG文件直接抠图

如何JPG文件直接抠图 先转为智能对象&#xff1a; 再栅格化图层 此进即可直接进行抠图&#xff01;

更快的Maven来了,我的天,速度提升了8倍!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;周末被 maven-mvnd 刷屏了&#xff0c;于是我也下载了一个 mvnd 体验了一把。虽然测试的数据都是基于我本地项目&#xff0c…

java bitset_Java BitSet intersects()方法与示例

java bitsetBitSet类intersects()方法 (BitSet Class intersects() method) intersects() method is available in java.util package. intersects()方法在java.util包中可用。 intersects() method is used to check the common number of bits set to true in both the BitSe…

【C++】For循环同时初始化两个及以上个变量

文章目录0.引言1.初始化同类型变量2.初始化两个不同类型的变量0.引言 \qquadC的for循环在初始化时可以通过类型定义符直接初始化两个相同类型的变量&#xff0c;但是对于不同类型的变量是不可以直接初始化的&#xff0c;若想达到类似python的zip()函数的多类型多变量迭代的效果…

Java 中接口和抽象类竟然有 7 点不同?

作者 | 磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;本文已收录《Java常见面试题》系列&#xff1a;https://gitee.com/mydb/interviewJava 是一门面向对象的编程语言&am…

粉丝不在于多,在于够残

李善友&#xff1a;所有可能被互联网取代的组织一定会被取代 2015-07-30 格局视野 格局视野 格局视野 微信号 geju365 功能介绍 格局生涯学院官方自媒体。面向互联网人的在线商学院。推送互联网行业知识&#xff0c;培养互联网实操人才。聚焦新行业、新模式、新公司、新人物。…

优化的交换排序(冒泡排序)_C程序实现优化的冒泡排序

优化的交换排序(冒泡排序)Bubble Sort is a simple, stable, and in-place sorting algorithm. Due to its simplicity, it is widely used as a sorting algorithm by computer programmers. 气泡排序是一种简单&#xff0c;稳定且就地的排序算法。 由于其简单性&#xff0c;它…

保姆级教学:缓存穿透、缓存击穿和缓存雪崩!

前言对于从事后端开发的同学来说&#xff0c;缓存已经变成的项目中必不可少的技术之一。没错&#xff0c;缓存能给我们系统显著的提升性能。但如果你使用不好&#xff0c;或者缺乏相关经验&#xff0c;它也会带来很多意想不到的问题。今天我们一起聊聊如果在项目中引入了缓存&a…

Fast Global Registration (ECCV 2016) 论文解析

目录0.友情链接1. 论文核心思想1.1. 点云特征匹配1.2. 两个校验1.3. 鲁棒函数与BR对偶1.4.1. Black-Rangarjan Duality (BR对偶性&#xff09;1.4.2.Derivation of Φρ\Phi_\rhoΦρ​1.4.3.E(T,L)E(\bm{T},L)E(T,L)的优化求解方法4.写在后面0.友情链接 FGR基本介绍 CSDN博客…

系统盘压缩卷小于可用空间_操作系统中的可用空间管理

系统盘压缩卷小于可用空间可用空间管理 (Free space management) As we know that the memory space in the disk is limited. So we need to use the space of the deleted files for the allocation of the new file. one optical disk allows only one write at a time in t…

关于头文件是否参与编译的讨论

一、文章来由 写项目的时候发现了这个问题&#xff0c;又是一个比较底层的问题&#xff0c;首先说明&#xff0c;这篇文章只是我根据查阅的资料和做的实验提出的一个讨论&#xff0c;并不一定就是正确答案。因为这个问题网上众说纷纭&#xff0c;我很欢迎大家参与这个讨论&…

Log4j漏洞?一行代码都不改就能永久修复?

△Hollis, 一个对Coding有着独特追求的人△作者 l Hollis来源 l Hollis&#xff08;ID&#xff1a;hollischuang&#xff09;这篇文章我周一发过&#xff0c;但是因为一些"人在江湖、身不由己"的原因&#xff0c;原文删除了&#xff0c;但是很多人找我还是想看看内容…

服务器自动抢占GPU运行程序

其原理是通过nvidia-smi扫描每块显卡上的内存&#xff0c;然后查询已经使用的内存&#xff0c;若已经使用的显卡内存不大于一个阈值&#xff0c;则运行python脚本&#xff08;你也可以替换成别的命令&#xff09; #!/bin/bash var0 ocp_memory${2:-500} while [ $var -eq 0 ] …

java range类_Java即时类| range()方法与示例

java range类即时类range()方法 (Instant Class range() method) range() method is available in java.time package. range()方法在java.time包中可用。 range() method is used to get the valid range of values for the given TemporalField. range()方法用于获取给定Temp…

ubuntu安装eclipse

2019独角兽企业重金招聘Python工程师标准>>> 在Ubuntu 13.04下的安装eclipse 一、eclipse安装过程 首先确保在安装eclipse之前已经安装好Java虚拟机 1. eclipse官网下载压缩包 下载地址&#xff1a;http://www.eclipse.org/downloads/download.php?file/technology…

java的parse方法_Java即时类| parse()方法与示例

java的parse方法即时类parse()方法 (Instant Class parse() method) parse() method is available in java.time package. parse()方法在java.time包中可用。 parse() method is used to get an Instant that parses the given char sequence and char sequence follow some st…

github果然强大

github果然强大&#xff0c;在idea里写好&#xff0c;可以直接提交到github&#xff0c;在哪台电脑都可以看源码了&#xff0c;手机也可以看 https://github.com/gaojinhua 转载于:https://www.cnblogs.com/gaojinhua/p/4705992.html

Python用sorted实现argsort

\qquadsorted函数会返回一个可迭代对象经过排序后的迭代器&#xff0c;sorted对于number类型的可迭代对象会按照数值大小排序&#xff0c;对于字符串则按照ASCII码顺序排序&#xff0c;但如果要返回排序的index怎么呢&#xff1f; \qquadsorted有一个功能就是根据key参数比较大…