【发布时间】:2016-05-05 14:58:58
【问题描述】:
我在尝试将 Java 对象编组为字符串时遇到类转换异常。我在我的 lib 文件夹中包含了 JAXB-2.1 jar。在部署到 WAS 时,我已将类加载器策略更改为最后一个父级,以便我的本地库中的 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。
【问题讨论】:
-
您是否检查了服务器中的策略,如果策略是单一的,那么服务器级模式将被强制应用于所有应用程序,如果策略是多个,那么每个应用程序将有自己的模式 @987654321 @
标签: java tomcat jaxb websphere ibm-was