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;
}
排查过程、思路
-
通过Google搜索,找到
NoSuchFieldError
的原因 🔗点击我 可能是在这个类中的某个属性找不到如何解决 NoSuchFieldError
为了避免这种情况
NoSuchFieldError
,所有现有文件都应该被清理并从头开始编译。然后,所有最新编译的文件都将可用,因此编译器将指出代码中任何缺失的字段,从而有助于避免NoSuchFieldError
运行时的错误。如果重新编译后错误仍然存在,可能是因为在编译时和运行时使用了不同版本的外部 JAR 文件。在这种情况下,应使用相同版本的 JAR 文件。
-verbose: class
使用检查加载的类的选项来运行应用程序也很有帮助。这可以帮助识别不兼容的类。 -
把Dog类删除,重新运行SpringBoot,发现可以运行。
-
把Dog重新添加回来,删删改改,看看改成什么样子的时候才可以运行
-
最后发现把所有Lombok的注解都删掉了以后,程序可以正常运行(此时需要自己手动添加Set方法等)
Spring是通过set方法注入值来新建对象,并且在容器中管理对象的,详情看Spring系列
-
通过NewBing搜索相应的报错信息(因为刚开始以为是SpringBoot的问题,所以根本没有关注到Lombok上)
你好,这是Bing。😊
根据搜索结果,你的错误可能是由于Lombok库和JDK的版本不兼容导致的1。你可以尝试以下方法:
- 更新你的Lombok库到最新版本,或者使用一个与你的JDK版本匹配的Lombok版本2。
- 检查你的代码中是否使用了**@Singular**注解,这个注解在某些JDK版本下会导致异常3。你可以删除这个注解,或者了解它的用法和限制45。
- 清理你的项目中的所有class文件,重新编译所有代码1。
希望这些信息对你有帮助。如果还有其他问题,请告诉我。👍
-
询问
Lombok最高支持什么版本的jdk
你好,这是Bing。😊
根据搜索结果,Lombok库支持Java 8以上的版本,但是在某些版本下可能会出现兼容性问题12。目前,Lombok的最新版本是1.18.22,它支持JDK 163。你可以尝试使用这个版本,或者查看Lombok的官方文档,了解它对不同JDK版本的支持情况。
希望这些信息对你有帮助。如果还有其他问题,请告诉我。👍
最终解决办法
-
替换相应版本的JDK,实测JDK18可以用
-
把语言级别都改成18
-
可以正常运行~
佛祖保佑,永无BUG
回顾与总结
-
根据框架的原理解决问题
比如说NoSuchFieldError报错的根源是在类中找不到属性,就要想到Spring容器是根据set方法来管理对象的,可以猜测是Lombok的问题,尝试增加set方法来解决
-
善用搜索引擎