JAXB Websphere jar与applicationl jar的java ClassCastException
在尝试将Java对象marhsal为字符串时,我遇到了一个类强制转换异常。我已经将JAXB-2.1 jar包含在我的lib文件夹中。在部署到WAS时,我将classloader策略更改为parent last,以便首先获取本地库中的jar。但这仍然会引发classcast异常,并显示以下消息。这个错误的原因是什么
javax.xml.bind.JAXBException: ClassCastException: attempting to cast jar:file:/opt/was7/base/crm/java/jre/lib/rt.jar!/javax/xml/bind/JAXBContext.class to wsjar:file:/prod/wesadm/wes/was7/base/profiles/sadasd/installedApps/asdadad/myapp.ear/myapp_war.war/WEB-INF/lib/jaxb-api-2.1.jar!/javax/xml/bind/JAXBContext.class. Please make sure that you are specifying the proper ClassLoader.
at javax.xml.bind.ContextFinder.handleClassCastException(ContextFinder.java:96)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:214)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:372)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522)
at com.my.MyClass.convertObjectToXML()
这是convertObjectToXML()方法
private <T> String convertObjectToXMLString(T obj) throws JAXBException {
JAXBContext jaxbContext = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = jaxbContext.createMarshaller();
StringWriter sw = new StringWriter();
marshaller.marshal(obj, sw);
return sw.toString();
}
当部署到Tomcat时,这种逻辑可以很好地工作。尽管我上一次提到类加载器是父类,但我还是不明白为什么会拾取WAS JAR
# 1 楼答案
看起来你把JAXB api JAR和你的应用捆绑在一起了。从你的应用中删除它们,它就会工作。这些JAR已经与WebSphere捆绑在一起(事实上它们是JRE的一部分),它会导致类加载器异常,因为存在相同类的两个版本
# 2 楼答案
这个
javax.xml.bind.ContextFinder.find(Class[] classes, Map properties)
将首先查找jaxb.property
。 如果未找到,它将尝试按以下顺序搜索/创建工厂:我相信你们的程序不提供jaxb。包
com.my
中的属性。 因此,工厂类是从WebSphereJDK/library加载的,它将返回一个JAXBContext
类的对象。 但是那门课和你们战争中的不同,所以javax.xml.bind.ContextFinder
扔ClassCastException
# 3 楼答案
在将应用程序迁移到Websphere 9时,我遇到了以下异常
我从应用程序中排除了JAR的所有引用,这些引用现在是IBMJDK的一部分。e、 g.斯塔克斯api