问题描述

我在开发一个博客后台管理系统时,使用了 Lombok 来简化我的实体类,减少 boilerplate 代码
我的实体类中使用了 @Data 注解,这应该会自动生成 getter、setter 等方法
但是,当我尝试在 ServiceImpl 中调用这些方法时,IDEA 却提示 “Cannot resolve method” 错误
明明使用了 @Data 注解,为什么方法却不存在呢?

错误信息示例:

java: 找不到符号: 方法 setPassword(java.lang.String)
位置: 类型为com.ln.blog.domain.po.User的变量 user

java: 找不到符号: 方法 setCreatedAt(java.time.LocalDateTime)
位置: 类型为 com.ln.blog.domain.po.User的变量 user

java: 找不到符号: 方法 setUpdatedAt(java.time.LocalDateTime)
位置: 类型为com.ln.blog.domain.po.User的变量 user

构建过程中的一些其他异常:

org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name ‘userMapper’ defined in file [D:\blog-m\target\classes\com\ln\blog\mapper\UserMapper.class]: Invalid value type for attribute ‘factoryBeanObjectType’: java.lang.String
Caused by: java.lang.NoSuchFieldError: ESCAPE_CHARACTER

问题分析

经过一系列的排查,我发现问题主要集中在以下几个方面:

  1. Lombok 注解未生效: 虽然使用了 @Data 注解,但 IDEA 并没有识别到 Lombok,并且没有生成对应的 getter 和 setter 方法
  2. Maven 依赖缓存问题: 我查看了 Maven 依赖缓存目录,发现存在一个 Lombok 的 “unknown” 版本,这表明 Maven 在下载 Lombok 依赖时可能遇到了问题,导致依赖不完整或损坏
  3. IDEA Lombok 插件问题: IntelliJ IDEA 可能会有自己的 Lombok 插件缓存或者配置,并且可能指向了 Maven 的错误缓存。

解决方案

  1. 清理 Maven 依赖缓存:

    • 手动删除了 Maven 本地仓库中 Lombok 依赖的 unknown 版本目录。
    • 删除 Lombok 的本地依赖缓存,让 Maven 重新下载依赖
      1
      2
      3
      4
      5
      # Maven  清理 lombok 依赖
      rm -rf ~/.m2/repository/org/projectlombok/lombok/

      # Gradle 清理 lombok 依赖
      rm -rf ~/.gradle/caches/modules-2/files-2.1/org.projectlombok/lombok
  2. 明确指定 Lombok 依赖版本: 在 pom.xml 文件中添加 Lombok 依赖,并指定明确的版本号:

    1
    2
    3
    4
    5
    <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.34</version>
    </dependency>
  3. 检查 IntelliJ IDEA Lombok 插件:

    • 确保 IntelliJ IDEA Lombok 插件已安装,并且是最新版本
    • 检查插件的配置,确保其指向正确的 Maven 本地仓库
    • 确认File -> Settings -> Build,Execution, Deployment -> Compiler -> Annotation Processors中 Enable annotation processing 被选中
  4. 重新导入 Maven 依赖: 在 pom.xml 文件右键,选择 Maven -> Reimport,强制重新导入 Maven 依赖。

  5. 清理并重新编译: 执行 mvn clean 和 mvn install, 清理项目并重新构建。

  6. 重启 IntelliJ IDEA: 重启 IntelliJ IDEA,确保插件和缓存重新加载。

总结

通过以上步骤,我成功解决了 Lombok 注解失效的问题
这个问题表面上看是代码问题,其实是依赖和 IDE 配置问题导致的

避免问题的建议
定期清理 Maven 依赖缓存: 可以定期清理本地的 Maven 依赖缓存,避免因缓存问题导致依赖加载失败
明确指定依赖版本: 在 pom.xml 文件中,尽量为每一个依赖指定明确的版本号,避免版本冲突
检查 IDE 插件: 定期检查和更新 IDE 插件,确保其版本与 IDE 和依赖兼容
查看错误日志: 仔细查看编译错误或者构建错误, 错误信息通常可以帮助我们快速定位问题