ClassCastException с JAXB - веб-сфера jar против приложения jar
Я получаю исключение приведения класса при попытке преобразовать Java-объект в строку. Я включил JAXB-2.1 jar в мою папку lib. При развертывании на 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 выбираются, хотя я в последний раз упоминал загрузчик классов как родительский.
3 ответа
Кажется, вы связали 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.
Я исключил все ссылки на банки из приложения, которые сейчас являются частью IBM jdk. например, 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)
буду искать jaxb.property
первый. Если не найден, попытайтесь найти / создать фабрику в следующей последовательности:
- Системное свойство javax.xml.bind.context.factory
- Поиск с использованием OSGi ServiceLoader
- Поиск услуг META-INF
Я считаю, что ваша программа не предлагает jaxb.property в пакете com.my
, Таким образом, класс фабрики загружается из библиотеки JDK/ библиотеки Websphere, он возвращает объект JAXBContext
учебный класс. Но этот класс отличается от класса в вашей WAR, поэтому javax.xml.bind.ContextFinder
бросать ClassCastException
,