SessionScoped获得不同的实例

时间:2012-09-02 07:37:02

标签: jboss cdi weld

我正在获得@SessionScoped bean的不同实例,用于对同一用户会话的两次调用。什么可以导致这个?

将带注释的bean @SessionScoped注入到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;
   ... 
}

的Servlet

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

1 个答案:

答案 0 :(得分:1)

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

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

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