如何解决Hibernate Envers DefaultRevisionEntity 不能转换为 Quarkus 类
我有一个 quarkus 应用程序,它使用 hibernate envers 来审计实体更改。审计工作正常(审计表被填满)。现在我想使用审计查询 api 来加载我的实体的审计历史记录,但出现以下异常:
@Transactional
public List<BatchTaskDbo> getHistory(String id) {
AuditReader auditReader = AuditReaderFactory.get(entityManager);
AuditQuery auditQuery = auditReader.createQuery().forRevisionsOfEntity(BatchTaskEntity.class,false);
auditQuery.add(AuditEntity.id().eq(id));
auditQuery.addOrder(AuditEntity.revisionNumber().asc());
List<BatchTaskEntity> tasks = auditQuery.getResultList();
return tasks.stream().map(this.mapper::toDbo).collect(Collectors.toList());
}
org.jboss.resteasy.spi.UnhandledException: java.lang.ClassCastException: class org.hibernate.envers.DefaultRevisionEntity$HibernateProxy$98ycAi74 cannot be cast to class com.acme.envers.database.model.BatchTaskEntity (org.hibernate.envers.DefaultRevisionEntity$HibernateProxy$98ycAi74 and com.acme.envers.database.model.BatchTaskEntity are in unnamed module of loader io.quarkus.bootstrap.classloading.QuarkusClassLoader @3ac04654)
at org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.java:106)
at org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.java:372)
at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:218)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:519)
at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:261)
at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:161)
at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:364)
at org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:164)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:247)
at io.quarkus.resteasy.runtime.standalone.RequestDispatcher.service(RequestDispatcher.java:73)
at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.dispatch(VertxRequestHandler.java:138)
at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.access$000(VertxRequestHandler.java:41)
at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler$1.run(VertxRequestHandler.java:93)
at io.quarkus.runtime.CleanableExecutor$CleaningRunnable.run(CleanableExecutor.java:231)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2415)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1452)
at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29)
at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29)
at java.base/java.lang.Thread.run(Thread.java:834)
at org.jboss.threads.JBossThread.run(JBossThread.java:501)
Caused by: java.lang.ClassCastException: class org.hibernate.envers.DefaultRevisionEntity$HibernateProxy$98ycAi74 cannot be cast to class com.acme.envers.database.model.BatchTaskEntity (org.hibernate.envers.DefaultRevisionEntity$HibernateProxy$98ycAi74 and com.acme.envers.database.model.BatchTaskEntity are in unnamed module of loader io.quarkus.bootstrap.classloading.QuarkusClassLoader @3ac04654)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1654)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
at com.acme.envers.database.core.DefaultBatchService.getHistory(DefaultBatchService.java:197)
at com.acme.envers.database.core.DefaultBatchService_Subclass.getHistory$$superaccessor2(DefaultBatchService_Subclass.zig:645)
at com.acme.envers.database.core.DefaultBatchService_Subclass$$function$$2.apply(DefaultBatchService_Subclass$$function$$2.zig:33)
at io.quarkus.arc.impl.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:54)
at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorBase.invokeInOurTx(TransactionalInterceptorBase.java:127)
at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorBase.invokeInOurTx(TransactionalInterceptorBase.java:100)
at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorRequired.doIntercept(TransactionalInterceptorRequired.java:32)
at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorBase.intercept(TransactionalInterceptorBase.java:53)
at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorRequired.intercept(TransactionalInterceptorRequired.java:26)
at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorRequired_Bean.intercept(TransactionalInterceptorRequired_Bean.zig:340)
at io.quarkus.arc.impl.InterceptorInvocation.invoke(InterceptorInvocation.java:41)
at io.quarkus.arc.impl.AroundInvokeInvocationContext.perform(AroundInvokeInvocationContext.java:41)
at io.quarkus.arc.impl.InvocationContexts.performAroundInvoke(InvocationContexts.java:32)
at com.acme.envers.database.core.DefaultBatchService_Subclass.getHistory(DefaultBatchService_Subclass.zig:602)
at com.acme.envers.database.core.endpoint.v1.DefaultBatchResource.lambda$getHistory$9(DefaultBatchResource.java:78)
at com.acme.envers.database.model.BaseEntity.withContext(BaseEntity.java:105)
at com.acme.envers.database.core.endpoint.v1.DefaultBatchResource.getHistory(DefaultBatchResource.java:78)
at com.acme.envers.database.core.endpoint.v1.DefaultBatchResource_ClientProxy.getHistory(DefaultBatchResource_ClientProxy.zig:140)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:170)
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:130)
at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:643)
at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:507)
at org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$2(ResourceMethodInvoker.java:457)
at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:364)
at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:459)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:419)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:393)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:68)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:492)
... 18 more
解决方法
看起来查询不是这样工作的,或者框架中存在错误。如果我查询修订号然后收集实体,则不会发生类转换异常。
@Transactional
public List<BatchTaskDbo> getHistory_Working_Version(String id) {
AuditReader auditReader = AuditReaderFactory.get(this.entityManager);
List<Number> revisions = auditReader.getRevisions(BatchTaskEntity.class,id);
List<BatchTaskEntity> tasks =new ArrayList<>();
for (Number revision : revisions) {
BatchTaskEntity revEntity = auditReader.find(BatchTaskEntity.class,BatchTaskEntity.class.getName(),id,revision,true);
tasks.add(revEntity);
}
return tasks.stream().map(this.mapper::toDbo).collect(Collectors.toList());
}
,
您应该使用 Quarkus 问题跟踪器上的复制器报告此问题:https://github.com/quarkusio/quarkus/issues/new?assignees=&labels=kind%2Fbug&template=bug_report.md&title=
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。