`
liwx2000
  • 浏览: 132226 次
  • 性别: 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依赖 /...

    IDEA中 Getter、Setter 注解不起作用的问题如何解决

    然而,有时在使用Lombok库进行开发时,可能会遇到IDEA中的Getter和Setter注解不起作用的问题。Lombok是一个能帮助开发者消除Java类中大量重复的getter和setter方法的库,通过注解的方式简化代码。当IDEA无法识别这些...

    lombok v1.16.6和v1.16.20

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

    IntelliJ IDEA快速创建getter和setter方法

    使用 Lombok 库,开发者可以使用 @Data 注解来标注 JavaBean,如此 IntelliJ IDEA 将自动生成 getter 和 setter 方法。 如何使用 Lombok 库 要使用 Lombok 库,开发者需要在 pom.xml 文件中添加依赖项: ``` ...

    lombok插件

    Lombok是一款非常受欢迎的Java开发工具,它通过注解的方式帮助开发者自动生成常见的getter、setter、构造函数等样板代码,从而极大地提高了开发效率并减少了代码的冗余。标题中的“lombok插件”指的是用于集成Lombok...

    eclipse小工具 getter和setter 自动添加中文的注释

    此外,一些插件如`Lombok`能完全自动化getter和setter的生成,甚至包括构造函数、equals()、hashCode()等方法,且支持自定义注释。 7. **代码规范与团队协作** 当团队协作时,确保所有成员对代码模板达成一致,...

    小辣椒插件lombok.rar

    小辣椒插件Lombok是一款广泛应用于Java开发领域的工具,它极大地简化了代码的编写,特别是对于getter、setter、equals、hashCode、toString等繁琐的样板代码。Lombok通过注解处理器在编译时自动插入这些方法,使得源...

    lombok的jar包.zip

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

    lombok jar包

    除了getter和setter,Lombok还提供了其他有用的注解,如`@NoArgsConstructor`、`@AllArgsConstructor`用于生成无参构造函数和全参构造函数,`@EqualsAndHashCode`用于自动生成满足equals()和hashCode()合同的方法,...

    lombok-1.16.16源码和文档

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

    Lombok代码生成

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

    lombok-plugin

    Lombok是一款非常受欢迎的Java库,它通过注解的方式简化了Java对象的创建,自动为我们生成getter、setter、构造函数等常见方法,极大地减少了代码的冗余。在本压缩包中,"lombok-plugin"是为IntelliJ IDEA提供的一个...

    lombok-1.16.20.jar

    Lombok的1.16.20版本是它的一个历史版本,提供了许多便利的功能,使得开发者不必手动编写大量的getter、setter、构造函数以及equals()、hashCode()和toString()等常规方法。 Lombok的核心在于它的注解,这些注解...

    lombok 插件,用于android studio,实现代码自动生成

    Lombok提供了一系列的注解,如`@Data`、`@Setter`、`@Getter`、`@NoArgsConstructor`、`@AllArgsConstructor`等,这些注解能够自动生成对应的JavaBeans方法,避免手动编写这些样板代码。例如,`@Data`注解可以自动...

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

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

    lombok8.rar

    当Lombok生成getter和setter时,它会检查这个注解,并在setter方法中添加对null值的检查。 4. `@Setter` 和 `@Getter`:这些注解允许你独立控制每个字段的getter和setter生成。如果你只想为特定字段生成getter或...

    lombok.jar(支持开发工具对“@Data”缺少插件而报错问题)

    当在类上使用`@Data`注解时,Lombok会自动生成所有字段的getter和setter,同时还会提供一个默认的构造函数,以及实现equals()、hashCode()和toString()方法。这样,开发者可以专注于核心业务逻辑,而不是繁琐的基础...

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

    Lombok提供了一种注解方式,通过在实体类上添加`@Data`注解,可以自动为所有字段生成getter和setter,甚至构造函数、equals()、hashCode()等方法,极大地减少了代码量。 接着,我们来看“实体类生成标签(lombok,...

    lombok2018.1-2019.3.zip

    1. `@Data`:这是Lombok最常用的注解之一,它会自动生成类的所有非静态字段的getter和setter,同时还会生成一个全参数的构造函数。 2. `@AllArgsConstructor`:此注解会为类生成一个包含所有字段的构造函数,而`@...

    lombok-1.16.18.zip

    1. `@Data`:这是一个复合注解,包含了`@Getter`、`@Setter`、`@ToString`、`@EqualsAndHashCode`等,可以为类的所有非静态、非transient字段自动生成getter和setter方法,并提供toString()和equals()及hashCode()...

Global site tag (gtag.js) - Google Analytics