有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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


共 (3) 个答案

  1. # 1 楼答案

    看起来你把JAXB api JAR和你的应用捆绑在一起了。从你的应用中删除它们,它就会工作。这些JAR已经与WebSphere捆绑在一起(事实上它们是JRE的一部分),它会导致类加载器异常,因为存在相同类的两个版本

  2. # 2 楼答案

    这个javax.xml.bind.ContextFinder.find(Class[] classes, Map properties) 将首先查找jaxb.property。 如果未找到,它将尝试按以下顺序搜索/创建工厂:

    1. 系统属性javax。xml。绑定上下文工厂
    2. 使用OSGi ServiceLoader进行查找
    3. 搜索META-INF服务

    我相信你们的程序不提供jaxb。包com.my中的属性。 因此,工厂类是从WebSphereJDK/library加载的,它将返回一个JAXBContext类的对象。 但是那门课和你们战争中的不同,所以javax.xml.bind.ContextFinderClassCastException

  3. # 3 楼答案

    在将应用程序迁移到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的一部分。e、 g.斯塔克斯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>