lombok生成getter、setter的小陷阱

本文探讨了使用Lombok注解自动生成getter和setter方法时遇到的与Jackson框架兼容性问题,特别是针对布尔类型的字段。通过对代码进行调整,解决了Jackson无法正确识别属性的问题。
最近做项目使用lombok生成getter和setter,代码如下:

[color=red]以下代码为示例代码:[/color]

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数据转换成这个对象时出现问题,错误信息如下:
[color=red]Exception in thread "main" org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "isLeader" (Class Member), not marked as ignorable[/color]

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

[img]http://dl.iteye.com/upload/attachment/0068/8386/9743bf9d-266d-30e1-a3ce-644603411fd7.jpg[/img]

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是不是也是呢?如下图:

[img]http://dl.iteye.com/upload/attachment/0068/8391/20dcc3ab-58ac-32cb-aac6-898fb08b4e4e.jpg[/img]

果然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(),所以编码时一定要小心。
<think>好的,用户遇到了Lombok没有生成GetterSetter方法的问题,需要帮忙解决。首先,我需要回忆一下Lombok的工作原理和常见的配置问题。根据用户提供的引用内容,可能的原因有几个。 首先,引用[1]提到,如果类中已经存在同名且参数数量相同的方法,Lombok不会生成对应的方法,并且会发出警告。所以第一个可能的原因是用户自己定义了与Getter/Setter同名的方法,导致Lombok跳过生成。这时候可能需要检查代码,看是否有这样的方法存在,或者是否误用了@Tolerate注解。 然后,引用[3]和[4]提到Lombok在Android开发中的使用,需要确保Gradle配置正确,特别是作为编译时依赖。如果用户的项目是Android应用,可能需要检查依赖是否正确添加,避免Lombok被打包到DEX文件中,同时确保注解处理器正确配置。此外,IDE插件是否安装也是一个关键点,比如在IntelliJ或Eclipse中需要启用Lombok插件,否则代码可能不会在IDE中显示生成的代码。 接着,引用[5]提到Lombok的基本概念,可能用户对Lombok的使用还不够熟悉,比如是否正确使用注解,比如@Getter和@Setter的位置是否正确,是否应用在类或字段上。如果注解放在类上,应该生成所有字段的Getter/Setter;如果放在特定字段上,则只生成该字段的。同时,用户可能没有启用注解处理,特别是在使用IDE时,需要确保启用注解处理功能,否则代码不会被处理。 另外,编译器的版本也可能影响Lombok的功能,如果使用较旧的Java版本,可能需要调整编译器设置。还有,构建工具如Maven或Gradle的配置是否正确,是否包含了必要的Lombok依赖和注解处理器配置。 综合这些可能的原因,解决方案应该从检查现有代码中的方法冲突开始,然后验证依赖配置和IDE设置,最后确认注解的正确使用和构建配置。需要逐步排查,从简单到复杂,确保每个环节都正确无误。</think>### 解决 Lombok生成 Getter/Setter 的方法 #### 1. **检查是否存在同名方法** - **问题原因**:如果类中已手动定义了与 Lombok 生成的 `getXxx()` 或 `setXxx()` 同名的方法,Lombok 会跳过生成以避免冲突[^1]。 - **解决方法**: - 删除手动定义的重复方法,或使用 `@Tolerate` 注解标记现有方法,告知 Lombok 忽略此方法[^1]。 - 注意:`@Tolerate` 不能用于参数数量相同的无参方法(如 `getter`),否则会导致编译错误。 #### 2. **验证 Lombok 依赖配置** - **问题原因**:未正确引入 Lombok 依赖或配置错误(尤其在 Android 项目中)[^3][^4]。 - **解决方法**: - **Maven 项目**:确保 `pom.xml` 包含以下依赖: ```xml <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> <scope>provided</scope> </dependency> ``` - **Android/Gradle 项目**:在 `build.gradle` 中添加: ```gradle dependencies { compileOnly 'org.projectlombok:lombok:1.18.24' annotationProcessor 'org.projectlombok:lombok:1.18.24' } ``` #### 3. **检查 IDE 插件与注解处理** - **问题原因**:IDE 未启用 Lombok 插件或注解处理功能[^3][^4]。 - **解决方法**: - **IntelliJ/Android Studio**: 1. 安装 `Lombok Plugin`(通过 `Preferences > Plugins`)。 2. 启用注解处理:`Settings > Build > Compiler > Annotation Processors > Enable annotation processing`。 - **Eclipse**: 1. 安装 Lombok 插件(下载 `lombok.jar` 并运行)。 2. 重启 IDE 并检查 `Enable annotation processing`。 #### 4. **确认注解使用方式** - **问题原因**:错误使用 Lombok 注解(如作用域错误)[^5]。 - **正确示例**: ```java @Getter @Setter // 类级别:生成所有字段的 getter/setter public class User { private String name; @Setter(AccessLevel.PROTECTED) // 字段级别:生成 protected setter private int age; } ``` #### 5. **清理并重新编译项目** - 执行以下操作确保生成代码生效: 1. 清理构建目录(如 `mvn clean` 或 `gradle clean`)。 2. 重新编译项目(如 `mvn compile` 或 `gradle build`)。 --- ### 相关问题 1. **Lombok 如何实现编译时代码生成?** (答案:通过注解处理器在编译时修改 AST,生成字节码[^5]) 2. **Lombok 在 Android 开发中有哪些限制?** (答案:需确保仅作为编译时依赖,避免 DEX 文件臃肿;部分注解可能不兼容[^3]) 3. **如何为特定字段禁用 Lombok 生成getter/setter?** (答案:使用 `@Getter(AccessLevel.NONE)` 或 `@Setter(AccessLevel.NONE)` 注解该字段[^4])
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值