在webapp之间共享对象时出现ClassCastError

时间:2013-03-15 06:44:26

标签: java web-applications servlets

注意:这不是交叉发布(尽管它与我的其他问题有关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。

1 个答案:

答案 0 :(得分:1)

第一个webapp中的对象类由第一个webapp类加载器加载。第二个webapp类加载器在第二个webapp中加载具有相同名称的类。因此,即使两个应用程序都可以访问具有相同名称的类,它们也是两个不同的类,因为它们不是由同一个类加载器加载的。

我不会尝试以这种方式在应用之间共享对象。它无论如何都不能在集群环境中工作,并且当被要求提供另一个servlet上下文时,更安全的容器可能返回null。考虑在两个应用程序之间共享数据库,并将共享数据存储在共享数据库中。

如果您仍想使用此路由,请确保共享类位于容器的类路径中,而不是每个webapp类路径中。