我们可以在同一个 EAR 中跨 Web 应用程序共享 CDI @ApplicationScoped bean 实例吗?
Can we share CDI @ApplicationScoped bean instance accross web application in the same EAR?
我有一个包含 2 个 Web 应用程序的 JavaEE 应用程序。我还有另一个库 Web 模块,其中包含 common_bean,由 @ApplicationScoped
注释
我的问题是:我可以在两个 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 异常而失败
有什么意见!
我发现了问题。我喜欢 post 这里的解决方案。它可能对某人有帮助:
解决方案是:配置Web库模块为EAR Module Assembly(Lib jar module) - 通过这样做,只创建了Common bean的实例,这个实例将被共享跨同一 EAR 中的所有 Web 应用程序。
我不确定这是不是 CDI 的规范,但它适用于 Glassfish 和 Wildfly。
我有一个包含 2 个 Web 应用程序的 JavaEE 应用程序。我还有另一个库 Web 模块,其中包含 common_bean,由 @ApplicationScoped
我的问题是:我可以在两个 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 异常而失败
有什么意见!
我发现了问题。我喜欢 post 这里的解决方案。它可能对某人有帮助:
解决方案是:配置Web库模块为EAR Module Assembly(Lib jar module) - 通过这样做,只创建了Common bean的实例,这个实例将被共享跨同一 EAR 中的所有 Web 应用程序。
我不确定这是不是 CDI 的规范,但它适用于 Glassfish 和 Wildfly。