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

2023-12-29

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

我的问题是:我可以在两个 Web 应用程序之间共享 common_bean 实例吗?

更新-我做了测试

在 Web 应用程序 1 (/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 应用程序 2 (/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 模块组件(Lib jar 模块) - 通过这样做,仅创建 Common bean 实例,并且该实例将在同一 EAR 中的所有 Web 应用程序之间共享。

我不确定这是否是 CDI 的规范,但它适用于 Glassfish 和 Wildfly。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐