[当我尝试从顶点调用数据库时,出现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 = "";
}
问候
您正在使用在幕后的Panache是受管理的JPA / Hibernate,它可能需要CDI Context才能起作用。因此,当您通过休息调用它时,它可以很好地工作,因为CDI已启动。如果您想在Quarkus中使用vert.x路由,建议您将Quarkus reactive-routes与上下文传播结合使用-已经配置好-以实现您的目标。