`
liwx2000
  • 浏览: 131840 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

lombok生成getter、setter的小陷阱

阅读更多
最近做项目使用lombok生成getter和setter,代码如下:

以下代码为示例代码:
import lombok.Setter;
import lombok.Getter;

@Getter
@Setter
public class Member {

	private String name;
	
	private long id;
	
	private int age;
	
	private boolean isLeader;

	@Override
	public String toString() { //方便打印结果
		return "Member [name=" + name + ", id=" + id + ", age=" + age
				+ ", isLeader=" + isLeader + "]";
	}
	
}


使用jackson,测试代码如下:
import org.codehaus.jackson.map.ObjectMapper;


public class JsonTest {
	
	public static void main(String[] args) throws Exception {
		ObjectMapper mapper = new ObjectMapper();
		Member m = mapper.readValue("{\"name\":\"jack\",\"id\":234902348,\"age\":25,\"isLeader\":false}", mapper.constructType(Member.class));
		System.out.println(m);
	}

}


结果将json数据转换成这个对象时出现问题,错误信息如下:
Exception in thread "main" org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "isLeader" (Class Member), not marked as ignorable

提示说isLeader这个property没有找到,但是明明是存在的。这时想到转换对象时,是通过setter将值set给每一个property的,会不会是因为setter不对导致找到property呢?查看一下生成setter,果然发现问题,如下图:



property的名称是isLeader,根据规则,生成的setter应该是setIsLeader(),但是实际却是setLeader(),问题应该就出在这里了,那么修改下Member的代码,来验证下我们的猜测,如下:

import lombok.Setter;
import lombok.Getter;

@Getter
@Setter
public class Member {

	private String name;
	
	private long id;
	
	private int age;
	
	private boolean isLeader;
	
	public void setIsLeader(boolean isLeader) { //补充一个setter
		this.isLeader = isLeader;
	}
	
	@Override
	public String toString() {
		return "Member [name=" + name + ", id=" + id + ", age=" + age
				+ ", isLeader=" + isLeader + "]";
	}

}


重新运行测试,问题不再出现,和猜测一样,是由于生成setter不规范导致的。

既然setter生成的不规范,那么getter是不是也是呢?如下图:



果然getter也是一样,并不是getIsLeader(),而是isLeader()。

最后,我们看看eclipse自动生成的getter和setter是什么样呢?

public class Member {

	private String name;
	
	private long id;
	
	private int age;
	
	private boolean isLeader;
	
	
	public boolean isLeader() {
		return isLeader;
	}


	public void setLeader(boolean isLeader) {
		this.isLeader = isLeader;
	}


	@Override
	public String toString() {
		return "Member [name=" + name + ", id=" + id + ", age=" + age
				+ ", isLeader=" + isLeader + "]";
	}

}


可见eclipse生成的getter、setter和lombok是一样的,但是eclipse生成的代码是显示的,可以看见,而lombok生成就不容易发现了。

最后说一下boolean型生成getter和setter的问题,如果boolean型property的名称是hello,b生成getter和setter的格式是isHello()和getHello(),如果名称是isHello,生成的还是isHello()和getHello(),这个是sun的规范,但是目前很多框架在使用getter和setter时并不是这样的,而是setHello ()或者setIsHello(),所以编码时一定要小心。
  • 大小: 10.7 KB
  • 大小: 14.9 KB
分享到:
评论
4 楼 zwllxs 2017-12-11  
是你自己编码不规范,和lombok没一点关系,model中,类型本来就不应该用基础类型,而是用包装类型,boolean你就用的不规范而应该用Boolean,用基础类型,有太多潜在问题
3 楼 kailee 2017-10-18  
博主分析了大半天的没用的。。。吓得我以为啥陷阱
一般boolean的属性都不加is
2 楼 xczzmn 2017-07-14  
将字段类型boolean换成Boolean就可以了
1 楼 xugangwen 2017-03-21  
和lombok没关系

相关推荐

    lombok.jar包 Lombok帮助我们生成这些 getter setter 全参构造无参构造equals hashcode

    //使用Lombok帮助我们生成这些内容 getter setter 全参构造无参构造equals hashcode //Lombok 使用步骤 // 1 检查idea是否已经安装 Lombok // 2 检查是否勾选了 enable annotation processer // 3 导入 Lombok依赖 /...

    java简便方法引入getter/setter/tostring等方法

    java 的eclipse或idea等 定义变量时 直接引入lombok.jar包 在类外部 引入@AllArgsConstructor @NoArgsConstructor @Data 简便方法引入getter/setter/tostring等方法

    lombok v1.16.6和v1.16.20

    lombok项目的产生就是为了省去我们手动创建getter和setter方法的麻烦,它能够在我们编译源码的时候自动帮我们生成getter和setter方法。即它最终能够达到的效果是:在源码中没有getter和setter方法,但是在编译生成的...

    lombok-plugin-0.28-2018.2.zip

    Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。出现的神奇就是在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法。...

    lombok-1.16.16源码和文档

      可以作用在类上和属性上,放在类上,会对所有的非静态(non-static)属性生成Getter/Setter方法,放在属性上,会对该属性生成Getter/Setter方法。并可以指定Getter/Setter方法的访问级别。 @EqualsAndHashCode  ...

    lombok的jar包.zip

    Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。出现的神奇就是在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法。...

    Lombok代码生成

    LomBok主要特性有:自动生成默认的getter/setter方法、自动化的资源管理(通过@Cleanup注解)及注解驱动的异常处理等。目前在国外广泛应用。 LomBok它和jquery一样,目标是让程序员写更少的代码,以及改进一些原始语法...

    IDEA插件-lombok-plugin-0.28-2019.3.rar

    Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。出现的神奇就是在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法。...

    lombok-plugin-0.23-IC-2017.3.zip

    Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。出现的神奇就是在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法。...

    lombok.jar eclipse插件

    eclipse/myeclipse下安装的lombok插件,可以自动生成getter,setter函数,避免手动写

    genarator代码注释,实体类无setter和getter,实体类生成标签(lombok,table等),实体类注释

    genarator自动生成代码,数据库字段类型映射java类型,实体类无setter和getter,实体类生成标签(lombok,table等),实体类注释,以及maven打包配置

    lombok的jar包

    不需要再写getter、setter或equals方法,只要有一个注解,你的类就有一个功能齐全的构建器、自动记录变量等等。 Lombok常用注解编辑 播报 Data 整合了Getter、Setter、ToString、EqualsAndHashCode、...

    mybatis逆向工程集合lombok最终版

    修改过源码的mybatis-generator代码生成器,去除mapper.xml里面的冗余字段,去除domain实体类中的冗余getset方法,改用lombok的@getter@setter@toString标签, ,内附安装破解教程, 小白可用, 一套清爽的改编版逆向工程...

    Lombok(Java库)

    @Getter / @Setter:自动生成字段的 getter 和 setter 方法。 @ToString:自动生成 toString 方法,方便输出对象的字符串表示。 @EqualsAndHashCode:自动生成 equals 和 hashCode 方法,用于对象的比较和哈希处理...

    idea lombok插件

    idea的lombok插件,支持注解添加getter setter以及构造方法和log

    lombok.jar网盘

    lombok是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具,简单来说,比如我们新建了一个类,然后在其中写了几个字段,然后通常情况下我们需要手动去建立getter和setter...

    lombok-1.16.18.jar

    自动资源管理,自动生成getter,setter,equals,hashCode和toString等等!

    java中千万别乱用!Lombok不是万能的

    @Builder使用后会给我们生成无参构造方法,但是无法生成Getter/Setter方法。 那么Builder在内部做了什么呢? 创建一个名为 ThisClassBuilder 的内部静态类,并具有和实体类相同的属性(称为构建器) 在构建器中:...

    lombok-plugin

    idea)中安装lombok plugin,可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具,简单来说,比如我们新建了一个类,然后在其中写了几个字段,然后通常情况下我们需要手动去建立...

    lombok.jar-1.18.0红辣椒代码生成工具

    Lombok是一款小巧的代码生成工具。官方网址:http://projectlombok.org/ LomBok主要特性有:自动生成默认的getter/setter方法、自动化的资源管理(通过@Cleanup注解)及注解驱动的异常处理等。目前在国外广泛应用。

Global site tag (gtag.js) - Google Analytics