diff --git a/independent-projects/arc/runtime/src/main/java/io/quarkus/arc/InjectableContext.java b/independent-projects/arc/runtime/src/main/java/io/quarkus/arc/InjectableContext.java index 027b5c2bc5ef8..144ef3c0a339c 100644 --- a/independent-projects/arc/runtime/src/main/java/io/quarkus/arc/InjectableContext.java +++ b/independent-projects/arc/runtime/src/main/java/io/quarkus/arc/InjectableContext.java @@ -11,13 +11,13 @@ /** * A context implementing this interface makes it possible to capture and view its state via the {@link ContextState}. - * + *

* It also allows users to destroy all contextual instances within this context. */ public interface InjectableContext extends AlterableContext { /** - * Destroy all existing contextual instances. + * Destroys the current context and all existing contextual instances. */ void destroy(); diff --git a/independent-projects/arc/runtime/src/main/java/io/quarkus/arc/impl/RequestContext.java b/independent-projects/arc/runtime/src/main/java/io/quarkus/arc/impl/RequestContext.java index 6ba7414ca9324..5164d84c374f3 100644 --- a/independent-projects/arc/runtime/src/main/java/io/quarkus/arc/impl/RequestContext.java +++ b/independent-projects/arc/runtime/src/main/java/io/quarkus/arc/impl/RequestContext.java @@ -64,7 +64,7 @@ public T getIfActive(Contextual contextual, Function, Creat throw Scopes.scopeDoesNotMatchException(this, bean); } RequestContextState ctxState = currentContext.get(); - if (ctxState == null) { + if (!isActive(ctxState)) { // Context is not active! return null; } @@ -102,7 +102,7 @@ public T get(Contextual contextual) { throw Scopes.scopeDoesNotMatchException(this, bean); } RequestContextState state = currentContext.get(); - if (state == null) { + if (!isActive(state)) { throw notActive(); } ContextInstanceHandle instance = (ContextInstanceHandle) state.contextInstances @@ -112,14 +112,17 @@ public T get(Contextual contextual) { @Override public boolean isActive() { - RequestContextState requestContextState = currentContext.get(); - return requestContextState == null ? false : requestContextState.isValid(); + return isActive(currentContext.get()); + } + + private boolean isActive(RequestContextState state) { + return state == null ? false : state.isValid(); } @Override public void destroy(Contextual contextual) { RequestContextState state = currentContext.get(); - if (state == null) { + if (!isActive(state)) { // Context is not active throw notActive(); } @@ -164,8 +167,7 @@ private void traceActivate(ContextState initialState) { @Override public ContextState getState() { RequestContextState state = currentContext.get(); - if (state == null) { - // Thread local not set - context is not active! + if (!isActive(state)) { throw notActive(); } return state; diff --git a/independent-projects/arc/tests/src/test/java/io/quarkus/arc/test/contexts/request/optimized/RequestContextInstancesTest.java b/independent-projects/arc/tests/src/test/java/io/quarkus/arc/test/contexts/request/optimized/RequestContextInstancesTest.java index 6ceaa360d3908..42b5269d1ce63 100644 --- a/independent-projects/arc/tests/src/test/java/io/quarkus/arc/test/contexts/request/optimized/RequestContextInstancesTest.java +++ b/independent-projects/arc/tests/src/test/java/io/quarkus/arc/test/contexts/request/optimized/RequestContextInstancesTest.java @@ -2,6 +2,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.UUID; import java.util.concurrent.ExecutionException; @@ -14,6 +15,7 @@ import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.context.ContextNotActiveException; import jakarta.enterprise.context.RequestScoped; import jakarta.inject.Inject; @@ -58,7 +60,8 @@ public void testContext() { InjectableContext appContext = container.getActiveContext(RequestScoped.class); // ContextInstances#removeEach() appContext.destroy(); - assertNotEquals(id2, boom.ping()); + // Request context was invalidated + assertThrows(ContextNotActiveException.class, () -> boom.ping()); container.requestContext().terminate(); }