【问题标题】:Use Conversation Scoped Beans in REST service在 REST 服务中使用会话范围的 Bean
【发布时间】:2013-01-14 17:07:47
【问题描述】:

我在 JBoss AS 7.1.1 上运行基于 CDI 的应用程序,它使用对话范围 Bean。 我需要从 RESTeasy 服务调用这些 bean 之一。不幸的是,当我调用 Conversation Scoped Bean

@Inject
private ConversationBean service; 


@GET
@Produces("text/html")
@Path("/book")
public void bookTicket(Long l) {

    service.book(l);
    . . . .
} 

返回以下错误:

原因:org.jboss.weld.context.ContextNotActiveException: WELD-001303 范围类型 javax.enterprise.context.ConversationScoped 没有活动上下文

这个问题有什么解决方法吗?
谢谢!

【问题讨论】:

    标签: jboss7.x cdi resteasy jboss-weld


    【解决方案1】:

    我知道我之前已经回答过这个问题(或者可能是@SessionScoped,真的一样)。对话与 CDI 中的会话相关联。由于 JAX-RS 中没有会话,因此没有对话。在规范第 6.7.4 节中,它声明对话范围仅在 JSF 请求期间处于活动状态。

    如果您想创建自己的 Scope 和 Context 就像对话一样,并使其可用于 JAX-RS 请求,这当然是可行的,但您必须有一些位置来存储范围并关联它带有一个请求。

    【讨论】:

    • 您能解释一下为什么javax.enterprise.context.SessionScoped 在RESTeasy 中似乎有效吗?还是因为我将 RESTeasy 与由同一个 JBoss(7.1.1-Final)提供服务的 AngularJS 网页结合使用?
    • 我敢打赌,如果你看一下,它会在每次访问它时创建一个新的会话范围的 bean 代理,或者你真的看到请求之间的状态被正确保留了吗?
    • 是的,cookie 被发送到客户端,然后当它被发回时,会话被保留在服务器中。 (注意:我们确实使用完整的浏览器作为 REST 客户端,我可以想象,当您使用无状态客户端时,cookie 不会被发回,因此您会丢失会话)
    • 如果其他人也有同样的问题,这篇博文解释了如何将 ConversationScoped 与 JAX-RS knitelius.com/2015/07/22/…一起使用
    猜你喜欢
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 2013-08-26
    • 2012-05-26
    • 2012-10-31
    • 1970-01-01
    相关资源
    最近更新 更多