Spring Boot:AbstractMethodError

这是一个抽象方法错误,通常发生在包版本不一致,导致部分方法没有找到实现。

场景

这个异常由虚拟机在运行时抛出。其原因是程序调用了抽象方法,这说明有一些方法没有被实现。在 Java 编译器编译时,会告知类的抽象方法没有实现。一些可能的情况如下: 使用了版本不正确的包(新版本提供了额外的抽象方法)

实际例子

在使用 Jadira Usertype Core 时,在 Spring Boot 2.1.x 与 JPA、Jadira 3.2.0.GA、Joda Money 0.10.0 配合下,出现了 AbstractMethodError 。

解决过程

开始发现这个问题后,我呆滞了半响。花费很多的时间寻求问题无果后,实施排除法。 在排除之前,我先使用官方的 JPA 例子 运行一个 JPA 程序,结果发现这个例子能够正确地运行。这说明Spring Boot JPA 本身没有什么问题。加入 自行编写部分 如实体类与 Repository 以及 POM 依赖,执行出现 AbstractMethodError 异常。 逐步减少自行编写部分,在减少 POM 中依赖时发现这个问题发生的原因:Jadira Usertype 使用了不正确的版本。更换更新的的版本后解决了问题。

参考

Oracle Java SE Docs: https://docs.oracle.com/javase/8/docs/api/java/lang/AbstractMethodError.html