【问题标题】:Hibernate Envers DefaultRevisionEntity cannot be cast to class QuarkusHibernate Envers DefaultRevisionEntity 不能强制转换为 Quarkus 类
【发布时间】:2021-06-07 17:45:00
【问题描述】:

我有一个 quarkus 应用程序,它使用休眠环境来审计实体更改。审计工作正常(审计表被填满)。现在我想使用审计查询 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

【问题讨论】:

    标签: hibernate quarkus hibernate-envers audit-logging


    【解决方案1】:

    这样查询似乎不起作用,或者框架中存在错误。如果我查询修订号然后收集实体,则不会发生类转换异常。

    @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());
    }
    

    【讨论】:

      【解决方案2】:

      您应该向 Quarkus 问题跟踪器上的复制者报告此问题:https://github.com/quarkusio/quarkus/issues/new?assignees=&labels=kind%2Fbug&template=bug_report.md&title=

      【讨论】:

      • 如果我有空闲时间,我会这样做。我将跟踪这个问题的进展。现在,如果有人使用旧版本,找到这个解决方案很重要。
      猜你喜欢
      • 2019-03-30
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多