【问题标题】:Combine Resteasy async fail to inject SessionScoped and RequestScoped bean with CDI结合 Resteasy 异步无法将 SessionScoped 和 RequestScoped bean 与 CDI 注入
【发布时间】:2012-03-30 04:55:57
【问题描述】:

我正在处理与 Reasteasy 中的异步作业相关的问题 (http://docs.jboss.org/resteasy/docs/2.3.1.GA/userguide/html_single/index.html#async_job_service)。

我发布了一个将 ?asynch=true 添加到 url 的请求,然后该作业异步运行,但是当它运行时,它可以与 @ApplicationScoped 或 @Singleton 注释 bean 一起正常工作,但它无法访问用声明的类的 bean @RequestScoped 注释,我总是遇到这个错误:

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:664)
    at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:77)
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:87)
    at com.examplecompany.exampleproject.multitenancy.org$jboss$weld$bean-flat-ManagedBean-class_com$examplecompany$exampleproject$multitenancy$PersistenceContext_$$WeldClientProxy.setDb(org$jboss$weld$bean-flat-ManagedBean-class_com$examplecompany$exampleproject$multitenancy$PersistenceContext$$_WeldClientProxy.java)
    at com.examplecompany.exampleproject.auth.oauth.secure.OAuthDelegate.filterHttp(OAuthDelegate.java:115)
    at com.examplecompany.exampleproject.auth.oauth.secure.AuthorizationInterceptor.preProcess(AuthorizationInterceptor.java:59)
    at com.examplecompany.exampleproject.auth.oauth.secure.org$jboss$weld$bean-flat-ManagedBean-com$examplecompany$exampleproject$auth$oauth$secure$AuthorizationInterceptor$@javax$enterprise$context$ApplicationScoped()@javax$ws$rs$ext$Provider()@org$jboss$resteasy$annotations$interception$SecurityPrecedence()@org$jboss$resteasy$annotations$interception$ServerInterceptor()${com$examplecompany$exampleproject$auth$oauth$secure$AuthorizationInterceptor$oauthDelegate$@javax$inject$Inject()$$}_$$_WeldClientProxy.preProcess(org$jboss$weld$bean-flat-ManagedBean-com$examplecompany$exampleproject$auth$oauth$secure$AuthorizationInterceptor$@javax$enterprise$context$ApplicationScoped()@javax$ws$rs$ext$Provider()@org$jboss$resteasy$annotations$interception$SecurityPrecedence()@org$jboss$resteasy$annotations$interception$ServerInterceptor()${com$examplecompany$exampleproject$auth$oauth$secure$AuthorizationInterceptor$oauthDelegate$@javax$inject$Inject()$$}_$$_WeldClientProxy.java)
    at org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:247)
    at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:222)
    at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:211)
    at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:525)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:502)
    at org.jboss.resteasy.core.AsynchronousDispatcher.invokeSuper(AsynchronousDispatcher.java:227)
    at org.jboss.resteasy.core.AsynchronousDispatcher$1.call(AsynchronousDispatcher.java:267)
    at org.jboss.resteasy.core.AsynchronousDispatcher$1.call(AsynchronousDispatcher.java:259)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:680)

如果我发布相同的请求而不添加 ?asynch=true,则不会发生此错误。

我进一步调查了这个问题并在我的代码中写了以下几行

try {
    Context context = beanManager.getContext(RequestScoped.class);
} catch (ContextNotActiveException e) {
    logger.info("Oops the context does not exists, we are in bad sh*t",e);
}

如果我处于异步模式,ContextNotActiveException总是被抛出,并且日志有相同的异常消息WELD-001303 No active contexts for scope type javax.enterprise.context.RequestScoped。

所以我猜当任务启动异步模式时,没有创建两个上下文会话和请求,因此我在这些范围内定义的bean是不可访问的。

我为此向 Resteasy Jira 提出了一张票:https://issues.jboss.org/browse/RESTEASY-682

【问题讨论】:

    标签: java cdi resteasy interceptor


    【解决方案1】:

    根据规范第 6.7.2 节,SessionScope 不适用于 Web 服务请求。您必须创建一个新的持久范围并使用它。 Web 服务调用(JAXRS 或 JAXWS)和会话的问题在于,没有保证可以跟踪从一个请求到下一个请求的会话。客户端不需要发回 cookie 或使用请求参数。如果您的服务需要并强制执行此操作,则您必须创建新的范围和上下文支持,或者使用 CDI 实现的 API 手动启动并绑定到会话范围。

    【讨论】:

    • 好点,我尝试将我的@SessionScoped 更改为@RequestScoped 但同样的问题在这里:org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active contexts for scope type javax.enterprise.context.RequestScoped
    • 我编辑了原始帖子以反映这一变化。事实上,我的问题只出现在显然 CDI 环境不可用的异步请求中。 :(
    • 奇数。 6.7.1 表示它应该是活动的。哪个服务器和版本?
    • 在tomcat 6.0.35下。但这又是resteasy的异步功能的问题,正常模式下的相同请求效果很好。 :(
    • 我彻底编辑了这个问题,以匹配我目前在这个问题上的进步。当我完成了一个错误并在 Resteasy 跟踪器中提出了一个问题时,我现在将编写一个解决方法。 :(
    猜你喜欢
    • 2019-08-04
    • 2014-06-02
    • 2016-08-02
    • 1970-01-01
    • 2012-03-03
    • 2016-06-08
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    相关资源
    最近更新 更多