首页 > 其他分享 >Lombok首字母小写,第二个字母大写的问题

Lombok首字母小写,第二个字母大写的问题

时间:2022-08-29 10:23:39浏览次数:68  
标签:String Spring 首字母 iPhone 小写 JavaBeans Lombok public

一、问题描述

最近在和前端对接接口的时候,发现后端接口返回给前端的一个字段大小写有问题,具体如下。

使用的开发框架及版本:

框架:SpringMVC;
Lombok版本:1.18.12;

对象简化后如下:

  1.   @Data
  2.   public class MobileInfo {
  3.   private String iPhone;
  4.   }

预期返回结果:iPhone,实际返回结果:iphone

也就是说SpringMVC环境下,使用Lombok注解@Data之后,返回给前端的是iphone,而不是我们预期中的iPhone

二、原因

针对首字母小写,第二个字母大写的这种驼峰命名时,使用@Data注解生成的getter和setter方法分别是:

  1.   public String getIPhone() {
  2.   return iPhone;
  3.   }
  4.    
  5.   public void setIPhone(String iPhone) {
  6.   this.iPhone = iPhone;
  7.   }

而正常场景下及Spring中对象的getter和setter方法应该是:

  1.   public String getiPhone() {
  2.   return iPhone;
  3.   }
  4.    
  5.   public void setiPhone(String iPhone) {
  6.   this.iPhone = iPhone;
  7.   }

也就是说Lombok与Spring针对这种首字母小写,第二个字母大写的对象的解析是不同的,而这也就自然而然影响到默认的Jackson的解析,导致返回给前端的属性名称不是我们预期中的名称。

2.1 Lombok问题

其实,针对这个问题,多年前就有人已经在lombok的github提出过对应的issue,参考:

https://github.com/projectlombok/lombok/issues/757

其实,无论是Lombok还是Spring,在处理对象的时候总会有一个API规范进行参考的,这个规范一般就是JavaBeans API的规范。而针对这个问题,Lombok的官方回复是:

JavaBeans的规范就是这样的,Lombok只是遵循这个规范而已,并且不应该使用首字母小写,第二个字母大写这样的命名规则,而Spring的处理方式才是没有遵循JavaBean的规范。除非Oracle官方推荐如此或者大家都是这样处理的化,Lombok才会进行修改。

也就是说,Lombok认为,JavaBeans的规范就是这么定义的,而针对JavaBean的规范,Spring和Lombok选择了不同的实现方式:

  • Spring,Jackson针对get/set的生成方式,和我们使用 IDEA 编译器自动生成get/set的方式是相同的,都是诸如getiPhone()的形式。
  • Lombok,针对get/set的生成方式,是getIPhone()的形式。

那么,针对JavaBeans规范的定义,到底是Spring的这种方式正确呢,还是Lombok的解析方式正确呢?

2.2 JavaBeans API规范

Lombok官方回复的JavaBeans API规范,是Sun 1997年的API规范文档:

https://download.oracle.com/otndocs/jcp/7224-javabeans-1.01-fr-spec-oth-JSpec/

根据这个文档,我去stackoverflow上搜了一下,最接近这个问题的描述应该是:8.8 Capitalization of inferred names

其实根据JavaBeans的描述,是没有具体说明针对我们文中这个问题,首字母小写,第二个字母大写这样的字段该如何get/set的,不过如果强行按照JavaBeans的规范来的话,那这个其实应该是:

  1.   public String getiPhone() { return iPhone;}
  2.   public void setiPhone(String iPhone) { this.iPhone = iPhone;}

那如果从这点上来说的话,其实Lombok的说法就不太恰当的了。

不过还有一种方式,就是如果站在Java中方法命名的角度上来说的话,也就是:Defing Methods - Naming a Method
那么,正确的命名方式应该是:

  1.   public String getIPhone() { return iPhone;}
  2.   public void setIPhone(String iPhone) { this.iPhone = iPhone;}

那么站到这个角度的话,Spring的方式又是不太恰当的了。

不过,总的来说,Lombok和Spring他们各自的实现本身没啥问题,只是针对javaBean的规范,各自选择了不同的实现策咯而已。

大家有兴趣的可以看下stackoverflow上的讨论及Lombok的回复:
https://stackoverflow.com/questions/2948083/naming-convention-for-getters-setters-in-java/49348966#49348966
https://github.com/projectlombok/lombok/issues/504

三、解决方式

知道了原因,其实解决起来也非常简单了,就是针对这种对象,手动生成get和set方法即可,或者使用编译器自动生成的,也就是如下:

  1.   public String getiPhone() {
  2.   return iPhone;
  3.   }
  4.    
  5.   public void setiPhone(String iPhone) {
  6.   this.iPhone = iPhone;
  7.   }

当然为了避免这种问题发生,还有一种更简单的方式,就是命名的时候,不要使用诸如xXXXX这种格式的命名,使用正常的命名方式,比如indexX这种形式。

标签:String,Spring,首字母,iPhone,小写,JavaBeans,Lombok,public
From: https://www.cnblogs.com/liftsail/p/16634975.html

相关文章

  • lombok @Builder注解
    https://blog.csdn.net/baidu_35085676/article/details/89193416?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%......
  • Lombok的使用 以及@EqualsAndHashCode
    @EqualsAndHashCode(of={"docId","travelDate"})其中,of选择指定的属性,构建生成equals方法与hashcode方法exclude排除制定属性lombok常用注释:1@Data//用于......
  • [FAQ] Windows 终端 git status 不识别文件名大小写的修改
     当我们修改了文件名的大小写,gitstatus显示没有文件改动。 出现这种情况,首先看一下git的配置项是否忽略了文件问大小写:$ gitconfigcore.ignorecase 如果是......
  • Lombok 注解
      @RequiredArgsConstructor用法: 在我们写controller或者Service层的时候,需要注入很多的mapper接口或者另外的service接口,这时候就会写很多的@Autowired注解,代码......
  • php是否区分大小写
    按常理来说,大多数语言都是区分大小写的,比如变量ab和AB是不同的,函数cd和CD也是不同的,但是php有点特别。首先,php中的变量和常量是区分大小写的。<?php $......
  • MySQL获取汉字的拼音首字母
    一、函数这里是通过函数调用进行获取汉字的拼音首字母。DELIMITER$$CREATEFUNCTION`pinyin`(P_NAMEVARCHAR(255))RETURNSvarchar(255)CHARSETutf8DETERMINIST......
  • 字符串大小写规则排序
    输入BadbAbB,输出AaBBbbd。因为A的ascii码比a小,所以相等的时候,直接输出a<b。不相等的时候,如果一个是大写,一个是小写,就要转换之后再比较。 #include<iostream>#include......
  • Winform下拉框使用拼音首字母查询
    项目需要一个搜索所在单位的选项,因为选项众多需要用下拉框来进行选择。众多选择为了更好的使用,采用了拼音首字母进行查询。显示的效果如果下:在输入框输入X出现X相关的单......
  • SpringBoot+Lombok+Builder实现任意个数属性的对象构造
    场景某个类有多个属性,在不同的业务场景下需要对不同对象赋值不同的属性。如果使用原始构造方法赋值,需要有几种情况的参数赋值,就在实体类中声明对应参数的构造方法。可以......
  • linux 中 sed命令替换命令时i选项忽略大小写
     001、(base)root@PC1:/home/test4#lsa.txt(base)root@PC1:/home/test4#cata.txtedsdgdEdGDf(base)root@PC1:/home/test4#sed's/e/MMM/'a.txt......