我有一个JavaEE应用程序,它有2个Web应用程序。我还有另一个库Web模块,其中包含由@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异常失败
任何评论!
答案 0 :(得分:2)
我发现了这个问题。我想在这里发布解决方案。它可能对某人有所帮助:
解决方案:将Web库模块配置为EAR模块程序集(Lib jar模块) - 通过这样做,只创建了Common bean的实例,并且将在所有Web应用程序中共享此实例相同的EAR。
我不确定这是CDI或NOT的规范,但它同时适用于Glassfish& Wildfly。