我们可以在同一个EAR中跨Web应用程序共享CDI @ApplicationScoped bean实例吗?

时间:2015-02-02 15:41:42

标签: java cdi

我有一个JavaEE应用程序,它有2个Web应用程序。我还有另一个库Web模块,其中包含由@ApplicationScoped

注释的common_bean

我的问题是:我可以跨两个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异常失败

任何评论!

1 个答案:

答案 0 :(得分:2)

我发现了这个问题。我想在这里发布解决方案。它可能对某人有所帮助:

解决方案:将Web库模块配置为EAR模块程序集(Lib jar模块) - 通过这样做,只创建了Common bean的实例,并且将在所有Web应用程序中共享此实例相同的EAR。

我不确定这是CDI或NOT的规范,但它同时适用于Glassfish& Wildfly。