我有一个具有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均适用。

10-04 11:39