2

对于对同一用户会话的两次调用,我得到了 @SessionScoped bean 的不同实例。什么会导致这种情况?

将注解 @SessionScoped 的 bean 注入到 servlet 和 RESTEasy JAX-RS Web 服务端点中。用户使用带有证书的 HTTPS 登录。第一个调用转到 RESTEasy 端点。来自浏览器的下一个调用转到 servlet。我希望在两个调用中使用相同的 bean 实例,但它们是不同的。... 有任何想法吗?

使用 JBoss 7.0.1

豆:

@Stateful
@SessionScoped
public class MyBean implements Serializable { ... }

REST 端点:

@Path("/one")
public class MyService extends JAXRSPlugin { 
   @Inject MyBean myBean;
   ... 
}

小服务程序:

@WebServlet(urlPatterns = "/two", asyncSupported = true)
public class MyServlet extends HttpServlet { 
   @Inject MyBean myBean;
   ... 
}
4

1 回答 1

1

事实证明,REST 服务方法实际上并不应该有一个 HttpSession 来共享状态。REST 服务应该是无状态的。它们被赋予@SessionScoped bean,就好像它们是设计的@RequestScoped。

对于这种情况,这不是我想要的,但也许我不应该对这些调用使用 REST。主要是我只想方便地将 URL 路径映射到我的 REST 服务类中的方法。据我所知,Servlet 没有这样的路径到方法映射。

基本上我看到了 3 个选项:(1) 寻找一种在一个 Servlet 中使用的调度机制,(2) 使用多个 Servlet,或者 (3) 通过滥用 @Context HttpServletRequest 来访问 HttpSession 来滥用 REST。我不喜欢滥用 API,所以选项 3 不可用。CDI 可能使选项 2 很酷,但选项 1 可能更常见(因此可能更容易被其他人维护)。

于 2012-09-02T16:28:30.780 回答