SpringBoot番外篇(一)

SpringBoot番外篇(一)NoSuchFieldError

起因经过

最近刚刚学习SpringBoot,然后在运行一个案例的时候,出现了报错:

java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.sun.tools.javac.tree.JCTree qualid'

而项目的结构很简单,只有一个pojo包,里面一个Dog类,代码如下:

package top.qwwq.springboot01helloword.pojo;

import lombok.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component // 把实体类交给Spring容器管理
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dog {
    @Value("旺财")
    private String name;
    @Value("3")
    private Integer age;
}

排查过程、思路

  1. 通过Google搜索,找到NoSuchFieldError的原因 🔗点击我 可能是在这个类中的某个属性找不到

    如何解决 NoSuchFieldError

    为了避免这种情况NoSuchFieldError,所有现有文件都应该被清理并从头开始编译。然后,所有最新编译的文件都将可用,因此编译器将指出代码中任何缺失的字段,从而有助于避免NoSuchFieldError运行时的错误。

    如果重新编译后错误仍然存在,可能是因为在编译时和运行时使用了不同版本的外部 JAR 文件。在这种情况下,应使用相同版本的 JAR 文件。

    -verbose: class使用检查加载的类的选项来运行应用程序也很有帮助。这可以帮助识别不兼容的类。

  2. 把Dog类删除,重新运行SpringBoot,发现可以运行。

  3. 把Dog重新添加回来,删删改改,看看改成什么样子的时候才可以运行

  4. 最后发现把所有Lombok的注解都删掉了以后,程序可以正常运行(此时需要自己手动添加Set方法等)

    Spring是通过set方法注入值来新建对象,并且在容器中管理对象的,详情看Spring系列

  5. 通过NewBing搜索相应的报错信息(因为刚开始以为是SpringBoot的问题,所以根本没有关注到Lombok上)

    你好,这是Bing。😊

    根据搜索结果,你的错误可能是由于Lombok库和JDK的版本不兼容导致的1。你可以尝试以下方法:

    希望这些信息对你有帮助。如果还有其他问题,请告诉我。👍

  6. 询问 Lombok最高支持什么版本的jdk

    你好,这是Bing。😊

    根据搜索结果,Lombok库支持Java 8以上的版本,但是在某些版本下可能会出现兼容性问题12。目前,Lombok的最新版本是1.18.22,它支持JDK 163。你可以尝试使用这个版本,或者查看Lombok的官方文档,了解它对不同JDK版本的支持情况。

    希望这些信息对你有帮助。如果还有其他问题,请告诉我。👍

最终解决办法

  1. 替换相应版本的JDK,实测JDK18可以用

  2. 把语言级别都改成18

  3. 可以正常运行~

    佛祖保佑,永无BUG

回顾与总结

  1. 根据框架的原理解决问题

    ​ 比如说NoSuchFieldError报错的根源是在类中找不到属性,就要想到Spring容器是根据set方法来管理对象的,可以猜测是Lombok的问题,尝试增加set方法来解决

  2. 善用搜索引擎


SpringBoot番外篇(一)
http://localhost:8090//archives/FtKPUTwx
作者
EnderKC
发布于
2024年12月23日
许可协议