gpt4 book ai didi

jax-rs - 为什么我会收到 WELD-001303 : No active contexts for scope type javax. enterprise.context.RequestScoped 异常?

转载 作者:行者123 更新时间:2023-12-01 09:14:46 26 4
gpt4 key购买 nike

我在网站上查看了与此错误相关的其他问题,但其中大多数问题要么与 SessionScope 有关,要么未得到解答。唯一可能有用的是No active contexts for scope type javax.enterprise.context.RequestScoped when invoking a bean from a thread但这不在我的上下文中。

我在 Wildfly 10.1 (Java ee 7) 上运行 JAX-RS 端点。看起来像这样:

@Path("")
public class ServerResource {

@Inject
Order order;

@Resource
ManagedExecutorService mes;

@PUT
@Path("/prepareOrder")
public void prepareOrder(@Suspended AsyncResponse response) {
mes.execute(() -> {
try {
Item item = new Item(); // JPA entity
order.setItem(item); // line 71
// call a service to save the order data (like item) to the DB
} catch (Exception e) {
e.printStackTrace();
response.resume(false);
}
response.resume(true);
});
}
}

我只是因为这个问题才添加了 try-catch,它通常不存在。 Order
@Stateful
@RequestScoped
public class Order {
private Item item;
// setter and getter
}

Order 是 RequestScoped,因为当它被使用/处理时,它会经历一种责任链(几个无状态 bean 注入(inject) Order 并按顺序更改它)。无论如何,问题不在于设计,而在于错误。

order.setItem(item);抛出异常:
org.jboss.weld.context.ContextNotActiveException: WELD-001303: No active contexts for scope type javax.enterprise.context.RequestScoped
at org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:689)
at org.jboss.weld.bean.ContextualInstanceStrategy$DefaultContextualInstanceStrategy.getIfExists(ContextualInstanceStrategy.java:90)
at org.jboss.weld.bean.ContextualInstanceStrategy$CachingContextualInstanceStrategy.getIfExists(ContextualInstanceStrategy.java:165)
at org.jboss.weld.bean.ContextualInstance.getIfExists(ContextualInstance.java:63)
at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:83)
at org.jboss.weld.bean.proxy.ProxyMethodHandler.getInstance(ProxyMethodHandler.java:125)
at com.a.b.Order$Proxy$_$$_WeldClientProxy.setItem(Unknown Source)
at com.a.c.ServerResource.lambda$0(ServerResource.java:71)
at org.jboss.as.ee.concurrent.ControlPointUtils$ControlledRunnable.run(ControlPointUtils.java:105)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.glassfish.enterprise.concurrent.internal.ManagedFutureTask.run(ManagedFutureTask.java:141)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
at org.glassfish.enterprise.concurrent.ManagedThreadFactoryImpl$ManagedThread.run(ManagedThreadFactoryImpl.java:250)

我试图用 @Stateless 注释 ServerResource 类或 RequestScope ( @Stateless vs @RequestScoped ) 但没关系。

为什么会出现此错误以及如何使我的代码正常工作?

最佳答案

在 CDI 中,上下文不会传播到其他线程,如果您看一下规范,就会发现上下文与线程相关联的分散概念。 Bean 存储(保存 bean 的“映射”)由 ThreadLocal 实现。所以它只是行不通。

使用现有上下文无法解决此问题 - 唯一的选择是定义您的自定义范围/上下文,它将处理跨线程的上下文传播。

编辑:请注意,现在有一个 JIRA ticket created 考虑向 Weld 添加类似此功能的功能。

关于jax-rs - 为什么我会收到 WELD-001303 : No active contexts for scope type javax. enterprise.context.RequestScoped 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46529534/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com