座机 发表于 2017-2-17 07:28:36

weblogic热部署重新产生classloader造成ClassCastException

最近在使用weblogic做web容器来开发应用,在使用过程中感觉很不方便,每次更改类,weblogic重新部署后,应用无法使用,需要重新启动weblogic,非常麻烦,造成开发效率奇低。经查后,原来是一同事做了个Filter(过滤器),每个request都经过此Filter,在filter中会从session中取出原来存的一个数据容器对象,进行数据比较;语句如下
SessionDataArea sessionDataArea = (SessionDataArea)session.getAttribute(SessionDataAreaUtil.SESSION_DATA_AREA_KEY);
,程序执行到这里提示类型转换错误。Debug后,得到其类型都是一样的。回想了ClassCastException造成的几个原因,考虑是classLoader的原因,对两个对象的classloader一比较,果然不一样。
    结论:weblogic在热部署时,会重新产生一个classloader,所以重启之前放在会话中的对象与当前class的classloader不一致。
    处理办法:1.自己写类加载器;
            2.抛弃原来的对象,重新产生新的对象


小提示:产生ClassCastException的主要原因有以下两点:

      1.类不兼容,当应用程序代码尝试将某一对象转换为某一子类时,如果该对象并非该子类的实例,JVM就会抛出ClassCastException异常。
      2.类兼容,但加载时使用了不同的ClassLoader

第二种一般很多开发朋友不会注意,在这里给大家提个醒。
页: [1]
查看完整版本: weblogic热部署重新产生classloader造成ClassCastException