博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用dom4j发现的一个问题
阅读量:6757 次
发布时间:2019-06-26

本文共 835 字,大约阅读时间需要 2 分钟。

在使用dom4j时碰到一个ClassCastException问题:org.dom4j.DocumentFactory不能转换为org.dom4j.DocumentFactory。

同一个类不能相互转换,一般是由于这是两个分别由不同类加载器加载的类的缘故。

检查发现,在一个webapp下和tomcat的shared目录下均存在dom4j的包,因此这两个类应该是分别从这两个包中加载的。

为什么会从两个地方的jar包分别加载同一个类呢?这有点奇怪,于是看了下dom4j的源码,发现问题在DocumentFactory的加载机制上。

DocumentFactory的实现类可以由用户自己指定,因此程序中选择通过ContextClassLoader进行加载,这是合理的,用户指定的类应该是可以通过当前线程的加载器加载。

问题出在:在share中的一个类使用到了dom4j,于是share加载了dom4j中的所有类。

而ContextClassLoader是webapp加载器,于是又从webapp中加载了一次DocumentFactory,并创建实现。

该实现再使用显示转换成share所加载的DocumentFactory类的实例,这样就发生异常了。

 

解决方法:

1.当然是只在一个地方放置dom4j的包。

2.这种情况不能完全避免,因此也可以在使用dom4j是显示地设置DocumentFactory实例,这样程序就不会再去加载该类了。

3.其实dom4j本身也可以改进一下,检查到用户指定的类以org.dom4j.开头则由当前加载器加载,其他的才通过ContextClassLoader进行加载。

 

扩展:

在程序中使用到ContextClassLoader加载类的地方也都最好进行检查,如果属于本jar包中的类则改用当前加载器加载。

 

转载于:https://www.cnblogs.com/goodjin/archive/2012/05/12/2497146.html

你可能感兴趣的文章
Express详解
查看>>
BZOJ3938 & UOJ88:[集训队互测2015]Robot——题解
查看>>
15:开发Rsync服务启动脚本案例
查看>>
shiro 更改登录的用户名
查看>>
mysql 权限
查看>>
iOS的主要框架介绍
查看>>
继承与访问权限
查看>>
C++ While学习笔记(2)
查看>>
WPF Expander控件(扩展面板)
查看>>
Django 实现分库
查看>>
人事面试100问题--巧妙应答
查看>>
ES6学习笔记<三> 生成器函数与yield
查看>>
AR(增强现实) 知识篇
查看>>
BizTalk接收消息后路由失败
查看>>
【工具类】怎么进入阿里云docker仓库
查看>>
Ceres-Solver库入门
查看>>
悲惨而又丢人的创业经历:草根创业者含恨倾诉为什么失败
查看>>
理解WebKit和Chromium: WebKit, WebKit2, Chromium和Chrome介绍
查看>>
hanoi塔的递归算法
查看>>
C# 校验给定的ip地址是否合法
查看>>