注意:这不是交叉发布(尽管它与我的其他问题有关shared objects between webapps of the same tomcat)
我有2个webapps在两个上下文中运行:c1,c2(都在根之后)。我把一个startupListener放在c1中共享一个变量,另一个放在c2中来检索它。问题是如果我共享一个内置数据类型的对象(如HashMap,Integer,...)它没关系,但是无法转换自定义数据类型。例如,如果我有一个名为User的自定义类,并传递该类型的对象,则会发生ClassCastError。
我在c1中的startuplistener是:
public void contextInitialized(ServletContextEvent sce) {
User user = new user("name");
Integer exampleInt = 1;
ServletContext context = sce.getServletContext().getContext("/c1");
if (context!=null)
{
context.setAttribute("user", user);
context.setAttribute("id", exampleInt);
}
}
在c2应用程序中,它是这样的:
public void contextInitialized(ServletContextEvent sce) {
ServletContext context = sce.getServletContext().getContext("/c1");
Integer integer = (Integer) context.getAttribute("id");//this line is OK
Object object = context.getAttribute("user");
User userObject = (User) object; //this line triggered error
User user = (User) context.getAttribute("user");// also trigger error
}
为什么这样? (一个类抱怨自己投射?)。任何解决方法:我想在同一个jvm的上下文之间共享我的对象。 TKS。
答案 0 :(得分:1)
第一个webapp中的对象类由第一个webapp类加载器加载。第二个webapp类加载器在第二个webapp中加载具有相同名称的类。因此,即使两个应用程序都可以访问具有相同名称的类,它们也是两个不同的类,因为它们不是由同一个类加载器加载的。
我不会尝试以这种方式在应用之间共享对象。它无论如何都不能在集群环境中工作,并且当被要求提供另一个servlet上下文时,更安全的容器可能返回null。考虑在两个应用程序之间共享数据库,并将共享数据存储在共享数据库中。
如果您仍想使用此路由,请确保共享类位于容器的类路径中,而不是每个webapp类路径中。