我正在获得@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;
...
}
答案 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可能更常见(因此其他人可能更容易维护)。