Quarkus:当我从顶点调用db时,ContextNotActiveException

问题描述 投票:0回答:1

[当我尝试从顶点调用数据库时,出现ContextNotActiveException。通过Rest路由器调用时,一切正常。

部署Verticle:

@Inject
Vertx vertx;

void onStart(@Observes StartupEvent startupEvent) {
    DeploymentOptions deploymentOptions = new DeploymentOptions();
    deploymentOptions.setWorker(true);
    deploymentOptions.setWorkerPoolSize(DEFAULT_WORKER_POOL_SIZE);

    vertx.deployVerticle(new FileFinderForSaveWorker(), deploymentOptions);
}

我的Verticle:

public class FileFinderForSaveWorker extends AbstractVerticle {

 @Override
 public void start(Promise<Void> startPromise) throws Exception {

    try {

        List<Media> mediaList = new MediaRepository().listAll();

    } catch (Exception e) {
        e.printStackTrace();
    }

 }
}

此行发生异常:

List<Media> mediaList = new MediaRepository().listAll();

javax.enterprise.context.ContextNotActiveException:接口javax.enterprise.context.RequestScoped在io.quarkus.hibernate.orm.runtime.RequestScopedEntityManagerHolder_ClientProxy.arc $ delegate(RequestScopedEntityManagerHolder_ClientProxy.zig:83)在io.quarkus.hibernate.orm.runtime.RequestScopedEntityManagerHolder_ClientProxy.getOrCreateEntityManager(RequestScopedEntityManagerHolder_ClientProxy.zig:191)在io.quarkus.hibernate.orm.runtime.entitymanager.TransactionScopedEntityManager.getEntityManager(TransactionScopedEntityManager.java:78)在io.quarkus.hibernate.orm.runtime.entitymanager.TransactionScopedEntityManager.createQuery(TransactionScopedEntityManager.java:317)在io.quarkus.hibernate.orm.runtime.entitymanager.ForwardingEntityManager.createQuery(ForwardingEntityManager.java:142)在io.quarkus.hibernate.orm.panache.runtime.JpaOperations.findAll(JpaOperations.java:328)在io.quarkus.hibernate.orm.panache.runtime.JpaOperations.listAll(JpaOperations.java:340)在ru.npc.sapsan.domain.repository.MediaRepository.listAll(MediaRepository.java)在ru.npc.sapsan.core.worker.FileFinderForSaveWorker.start(FileFinderForSaveWorker.java:18)在io.vertx.core.impl.DeploymentManager.lambda $ doDeploy $ 9(DeploymentManager.java:556)在io.vertx.core.impl.ContextImpl.executeTask(ContextImpl.java:369)在io.vertx.core.impl.WorkerContext.lambda $ wrapTask $ 0(WorkerContext.java:35)在io.vertx.core.impl.TaskQueue.run(TaskQueue.java:76)在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624)在io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)在java.lang.Thread.run(Thread.java:748)

我以为context-propagation应该可以帮到我,但不起作用。

我在build.gradle中的依赖项:

    dependencies {
      annotationProcessor 'org.projectlombok:lombok:1.18.10'
      compileOnly 'org.projectlombok:lombok:1.18.10'
      implementation 'io.quarkus:quarkus-smallrye-reactive-streams-operators'
      implementation 'io.quarkus:quarkus-smallrye-context-propagation-parent:1.2.1.Final'
      implementation 'io.quarkus:quarkus-jdbc-postgresql'
      implementation 'io.quarkus:quarkus-hibernate-orm-panache'
      implementation 'io.quarkus:quarkus-tika'
      implementation 'io.quarkus:quarkus-vertx-web'
      implementation 'io.quarkus:quarkus-smallrye-openapi'
      implementation 'io.quarkus:quarkus-vertx'
      implementation 'io.quarkus:quarkus-flyway'
      implementation 'io.quarkus:quarkus-hibernate-orm'
      implementation 'org.projectlombok:lombok:1.18.10'
      implementation enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")
      implementation 'io.quarkus:quarkus-resteasy'
      implementation 'org.xerial.snappy:snappy-java:1.1.7.3'
      implementation 'org.reflections:reflections:0.9.11'

      testImplementation 'io.quarkus:quarkus-junit5'
      testImplementation 'io.rest-assured:rest-assured'
     }

我使用hibernate-orm-panache

存储库:

 @ApplicationScoped
 public class MediaRepository implements PanacheRepository<Media> {
 }

Entity:

@Data
@Entity
@EqualsAndHashCode(callSuper = false)
@Table(name = "media")
public class Media extends PanacheEntity {

   @SerializedName("uuid")
   @Column(name = "uuid", unique = true, nullable = false, columnDefinition = "varchar(36)", length = 36, updatable = false)
   private String uuid = "";

}

问候

vert.x entitymanager quarkus
1个回答
0
投票

您正在使用在幕后的Panache是​​受管理的JPA / Hibernate,它可能需要CDI Context才能起作用。因此,当您通过休息调用它时,它可以很好地工作,因为CDI已启动。如果您想在Quarkus中使用vert.x路由,建议您将Quarkus reactive-routes与上下文传播结合使用-已经配置好-以实现您的目标。

© www.soinside.com 2019 - 2024. All rights reserved.