springboot2+Hibernate报错:java.lang.AbstractMethodError nullSafeGet

本文解决SpringBoot从1.x升级至2.0.8后,因jasypt版本不兼容导致的启动错误。通过将jasypt从hibernate4升级至hibernate5并调整代码引用,成功解决了AbstractMethodError异常。

背景:

        为引入某组件,将springboot版本由1.x升级到2.0.8,升级后springboot启动报错

错误堆栈:

java.lang.AbstractMethodError
at org.hibernate.type.CustomType.nullSafeGet(CustomType.java:119)
at org.hibernate.type.AbstractType.hydrate(AbstractType.java:82)
at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2854)
at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1747)
at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1673)
at org.hibernate.loader.Loader.getRow(Loader.java:1562)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:732)
at org.hibernate.loader.Loader.processResultSet(Loader.java:991)
at org.hibernate.loader.Loader.doQuery(Loader.java:949)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341)
at org.hibernate.loader.Loader.doList(Loader.java:2692)
at org.hibernate.loader.Loader.doList(Loader.java:2675)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2507)
at org.hibernate.loader.Loader.list(Loader.java:2502)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:502)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:392)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1489)
at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1445)
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1414)
 

org.jasypt.hibernate4.type.EncryptedStringType.nullSafeGet(Ljava/sql/ResultSet;[Ljava/lang/String;Lorg/hibernate/engine/spi/SharedSessionContractImplementor;Ljava/lang/Object;)Ljava/lang/Object; java.lang.AbstractMethodError: org.jasypt.hibernate4.type.EncryptedStringType.nullSafeGet(Ljava/sql/ResultSet;[Ljava/lang/String;Lorg/hibernate/engine/spi/SharedSessionContractImplementor;Ljava/lang/Object;)Ljava/lang/Object; at org.hibernate.type.CustomType.nullSafeGet(CustomType.java:119) at org.hibernate.type.AbstractType.hydrate(AbstractType.java:82) at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2854) at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1747) at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1673) at org.hibernate.loader.Loader.getRow(Loader.java:1562) at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:732) at org.hibernate.loader.Loader.processResultSet(Loader.java:991) at org.hibernate.loader.Loader.doQuery(Loader.java:949) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341) at org.hibernate.loader.Loader.doList(Loader.java:2692) at org.hibernate.loader.Loader.doList(Loader.java:2675) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2507) at org.hibernate.loader.Loader.list(Loader.java:2502) at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:502) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:392) at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216) at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1489) at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1445) at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1414) at org.hibernate.query.internal.AbstractProducedQuery.getSingleResult(AbstractProducedQuery.java:1463)

报错原因:

https://discourse.hibernate.org/t/java-lang-abstractmethoderror-at-org-hibernate-type-customtype-nullsafeget/780

由于项目中使用jasypt包里的EncryptedStringType类中需要对String字段进行处理,springboot2升级后与jasypt-hibernate4中的部分类不兼容导致org.hibernate.type.CustomType.nullSafeGet无法通过反射得到

解决方案:

springboot1.x升级2.x后,在gradle文件中将jasypt由hibernate4升级到hibernate5,同时注意采用1.9.3版本

compile('org.jasypt:jasypt-hibernate5:1.9.3')

同时修改项目中import了hibernate4的代码改为hibernate5

---------------------------------------------------------------------------------------------------------------------------------升级springboot2后如果遇到gradle构建报错 ‘找不到符号’,可参考如下链接

https://blog.youkuaiyun.com/Shaochen_/article/details/80263768#commentBox

 

 

Java 编程中,`ExecutionException` 和 `AbstractMethodError` 是两种不同类型的异常,它们分别属于不同的异常体系结构,且产生的原因和解决方式也各不相同。 ### ExecutionException `ExecutionException` 是 `java.util.concurrent` 包中定义的一个受检异常(checked exception),通常在使用 `Future` 对象获取异步任务执行结果时抛出。它封装了异步任务在执行过程中抛出的异常。`ExecutionException` 通常表示任务执行过程中发生了异常,而该异常被封装在其内部。 #### 常见原因: - 异步任务(如 `Callable`)在执行过程中抛出了异常。 - 使用 `Future.get()` 方法获取结果时,如果任务执行过程中抛出了异常,就会被封装为 `ExecutionException`。 #### 解决方案: - **捕获并检查原因**:通过 `getCause()` 方法获取原始异常,进一步分析问题根源。 - **处理异步任务中的异常**:在 `Callable` 或 `Runnable` 内部使用 try-catch 捕获异常,避免异常传播到外部。 ```java ExecutorService executor = Executors.newSingleThreadExecutor(); Future<?> future = executor.submit(() -> { // 模拟异常 throw new RuntimeException("Task failed"); }); try { future.get(); } catch (ExecutionException e) { System.err.println("ExecutionException occurred: " + e.getCause().getMessage()); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } ``` ### AbstractMethodError `AbstractMethodError` 是 `java.lang` 包中的一个错误(`Error` 的子类),表示应用程序试图调用一个抽象方法。这种错误通常发生在类版本不一致的情况下,例如某个类在编译时依赖于某个接口的实现,但在运行时该接口的实现类没有提供具体实现。 #### 常见原因: - **类版本不兼容**:编译时使用的类与运行时加载的类不一致,导致某个方法在运行时仍然是抽象的。 - **依赖冲突**:项目中存在多个版本的库,导致某些类未能正确加载。 #### 解决方案: - **检查依赖版本**:确保所有依赖库的版本一致,避免版本冲突。 - **重新编译代码**:确保所有类与接口的实现保持一致,避免使用过时或不兼容的类。 - **清理构建工具缓存**:使用 Maven、Gradle 等构建工具时,清理缓存后重新构建项目。 ```java public interface MyInterface { void doSomething(); } public class MyClass implements MyInterface { // 忘记实现 doSomething 方法 } public class Main { public static void main(String[] args) { MyClass obj = new MyClass(); obj.doSomething(); // 运行时会抛出 AbstractMethodError } } ``` ### 综合分析与建议 - `ExecutionException` 是并发编程中常见的异常,通常可以通过捕获内部异常并进行日志记录或恢复操作来处理。 - `AbstractMethodError` 则更多是由于类版本或依赖管理问题导致的,应通过构建工具管理依赖版本、清理缓存以及确保接口实现完整性来避免。 ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值