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 первый. Если не найден, попытайтесь найти / создать фабрику в следующей последовательности:

  1. Системное свойство javax.xml.bind.context.factory
  2. Поиск с использованием OSGi ServiceLoader
  3. Поиск услуг META-INF

Я считаю, что ваша программа не предлагает jaxb.property в пакете com.my, Таким образом, класс фабрики загружается из библиотеки JDK/ библиотеки Websphere, он возвращает объект JAXBContext учебный класс. Но этот класс отличается от класса в вашей WAR, поэтому javax.xml.bind.ContextFinder бросать ClassCastException,

Другие вопросы по тегам