我有一个具有2个Web应用程序的JavaEE应用程序。我还具有另一个包含由@ApplicationScoped
注释的common_bean的库Web模块。
我的问题是:我可以在两个Web应用程序之间共享common_bean实例吗?
更新-我做了测试
在Web App1(/ web1)中
@WebServlet("/Servlet1")
public class Servlet1 extends HttpServlet {
@Inject
CommonBean commonBean;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
commonBean.setValue("Servlet1: " + System.currentTimeMillis() + "--" + commonBean);
}
}
在Web App2(/ web2)中
@WebServlet("/Servlet2")
public class Servlet2 extends HttpServlet {
@Inject
CommonBean commonBean;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
commonBean.setValue("Servlet2: " + System.currentTimeMillis() + "--" + commonBean);
}
}
结果
如果我先运行/ Web1 / Servlet1,则运行/ Web2 / Servlet2:
/ Web1 / Servlet1 -------工作
/ Web2 / Servlet2 -------失败,发生CDI异常
如果我先运行/ Web2 / Servlet2,则运行/ Web1 / Servlet1 :(重新启动服务器,然后重新测试)
/ Web2 / Servlet2 -------工作
/ Web1 / Servlet1 -------失败,发生CDI异常
任何意见!
最佳答案
我发现了问题。我喜欢在这里发布解决方案。它可以帮助某人:
解决方案是:将Web库模块配置为EAR模块组装(库jar模块)-这样,将仅创建Common Bean实例,并且该实例将在同一EAR中的所有Web应用程序之间共享。
我不确定这是否是CDI规范,但它对Glassfish和Wildfly均适用。