当我试图将Java对象marhsal转换为字符串时,遇到了一个类强制转换异常。我已经在我的lib文件夹中包含了JAXB-2.1 jar。当部署到WAS时,我已经将类加载器策略更改为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会被使用。
您似乎将JAXB api jar与应用程序捆绑在一起。从你的应用程序中删除它们,它就会起作用。这些jar已经与WebSphere捆绑在一起(事实上,它们是JRE的一部分),这会导致类加载器异常,因为存在相同类的两个版本
在将应用程序迁移到Websphere 9时,出现以下异常。
java.lang.Exception: javax.xml.bind.JAXBException: ClassCastException: attempting to cast jar:file:/D:/WebSphere/AppServer/endorsed_apis/jaxb-api.jar!/javax/xml/bind/JAXBContext.class to wsjar:file:/D:/sites/XXXX.ear/Web.war/WEB-INF/lib/jaxb-api-2.2.10.jar!/javax/xml/bind/JAXBContext.class. Please make sure that you are specifying the proper ClassLoader.
我从应用程序中排除了jar的所有引用,该应用程序现在是IBMjdk的一部分。例如stax-api
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>2.6.0</version>
<exclusions>
<exclusion>
<groupId>stax</groupId>
<artifactId>stax-api</artifactId>
</exclusion>
<exclusion>
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
</exclusion>
</exclusions>
</dependency>
javax.xml.bind.ContextFinder.find(Class[] classes, Map properties)
将首先查找CCD_ 2。如果没有找到,它会尝试按以下顺序搜索/创建工厂:
- 系统属性javax.xml.bind.context.factory
- 使用OSGi ServiceLoader查找
- 搜索META-INF服务
我相信您的程序包com.my
中没有提供jaxb.property。所以工厂类是从Websphere JDK/库加载的,它将返回一个JAXBContext
类的对象。但是该类与WAR中的类不同,所以javax.xml.bind.ContextFinder
抛出ClassCastException
。