Unbelievable: Cannot cast from class X to its super class

给你一囗甜甜゛ 提交于 2019-12-10 09:32:04

问题


I'm encountering a very weird problem with Spring (3.0.1.RELEASE), TestNG (5.11) and Maven Surefire (2.5). I have a test class that extends a Spring helper class for testNG so that test context can be loaded from an xml file (that contains some bean definitions). My project was imported into eclipse using m2eclipse (using Import Maven Project) The class run fine in Eclipse TestNG runner. However, it throws this exception with Maven Surefire

Caused by: java.lang.ClassCastException: com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl cannot be cast to javax.xml.parsers.DocumentBuilderFactory
 at javax.xml.parsers.DocumentBuilderFactory.newInstance(DocumentBuilderFactory.java:123)
 at org.springframework.beans.factory.xml.DefaultDocumentLoader.createDocumentBuilderFactory(DefaultDocumentLoader.java:89)
 at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:70)
 at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:388)

I have eliminated all involved dependencies in my pom so that the two classes com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl and javax.xml.parsers.DocumentBuilderFactory are coming from JRE only (the rt.jar).

So, it looks so unbelievable to me.

I wonder if there is any mechanism in loading class that can explain for this behavior?

Thanks.

Updated: Here is my dependency tree:

[INFO] org.seamoo:seamoo-webapp:war:1.0-SNAPSHOT
[INFO] +- com.google.appengine:appengine-api-1.0-sdk:jar:1.3.1:compile
[INFO] +- com.google.gwt:gwt-servlet:jar:2.0.3:compile
[INFO] +- com.google.gwt:gwt-user:jar:2.0.3:provided
[INFO] +- org.apache.geronimo.specs:geronimo-servlet_2.5_spec:jar:1.2:provided
[INFO] +- org.slf4j:slf4j-api:jar:1.5.6:compile
[INFO] +- ch.qos.logback:logback-classic:jar:0.9.15:compile
[INFO] |  \- ch.qos.logback:logback-core:jar:0.9.15:compile
[INFO] +- org.springframework:spring-webmvc:jar:3.0.1.RELEASE:compile
[INFO] |  +- org.springframework:spring-asm:jar:3.0.1.RELEASE:compile
[INFO] |  +- org.springframework:spring-beans:jar:3.0.1.RELEASE:compile
[INFO] |  +- org.springframework:spring-context:jar:3.0.1.RELEASE:compile
[INFO] |  |  \- org.springframework:spring-aop:jar:3.0.1.RELEASE:compile
[INFO] |  +- org.springframework:spring-core:jar:3.0.1.RELEASE:compile
[INFO] |  |  \- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] |  +- org.springframework:spring-expression:jar:3.0.1.RELEASE:compile
[INFO] |  \- org.springframework:spring-web:jar:3.0.1.RELEASE:compile
[INFO] |     \- aopalliance:aopalliance:jar:1.0:compile
[INFO] +- org.springframework:spring-context-support:jar:3.0.1.RELEASE:compile
[INFO] +- org.apache.tiles:tiles-jsp:jar:2.1.4:compile
[INFO] |  \- org.apache.tiles:tiles-servlet:jar:2.1.4:compile
[INFO] +- org.apache.tiles:tiles-portlet:jar:2.1.4:compile
[INFO] |  \- org.apache.tiles:tiles-core:jar:2.1.4:compile
[INFO] |     +- org.apache.tiles:tiles-api:jar:2.1.4:compile
[INFO] |     +- commons-digester:commons-digester:jar:1.8.1:compile
[INFO] |     |  \- commons-beanutils:commons-beanutils:jar:1.8.0:compile
[INFO] |     \- commons-logging:commons-logging-api:jar:1.1:compile
[INFO] +- org.apache.tomcat:jasper-el:jar:6.0.26:compile
[INFO] |  \- org.apache.tomcat:el-api:jar:6.0.26:compile
[INFO] +- org.freemarker:freemarker:jar:2.3.16:compile
[INFO] +- org.tuckey:urlrewritefilter:jar:3.1.0:compile
[INFO] +- org.seamoo.utils:converter:jar:0.1:compile
[INFO] +- junit:junit:jar:4.6:test
[INFO] +- org.springframework:spring-test:jar:3.0.1.RELEASE:test
[INFO] +- org.testng:testng:jar:jdk15:5.11:test
[INFO] +- net.sourceforge.htmlunit:htmlunit:jar:2.7:test
[INFO] |  +- commons-collections:commons-collections:jar:3.2.1:test
[INFO] |  +- commons-lang:commons-lang:jar:2.4:test
[INFO] |  +- commons-httpclient:commons-httpclient:jar:3.1:test
[INFO] |  +- commons-codec:commons-codec:jar:1.4:test
[INFO] |  +- net.sourceforge.htmlunit:htmlunit-core-js:jar:2.7:test
[INFO] |  +- net.sourceforge.nekohtml:nekohtml:jar:1.9.14:test
[INFO] |  +- net.sourceforge.cssparser:cssparser:jar:0.9.5:test
[INFO] |  |  \- org.w3c.css:sac:jar:1.3:test
[INFO] |  \- commons-io:commons-io:jar:1.4:test
[INFO] +- org.jbehave:jbehave-core:jar:2.5:test
[INFO] |  +- junit:junit-dep:jar:4.4:test
[INFO] |  \- org.hamcrest:hamcrest-all:jar:1.1:test
[INFO] +- org.mockito:mockito-all:jar:1.8.4:test
[INFO] +- org.powermock.modules:powermock-module-testng:jar:1.3.7:test
[INFO] |  \- org.powermock:powermock-core:jar:1.3.7:test
[INFO] |     +- org.powermock.reflect:powermock-reflect:jar:1.3.7:test
[INFO] |     |  \- org.objenesis:objenesis:jar:1.2:test
[INFO] |     \- javassist:javassist:jar:3.10.0.GA:test
[INFO] +- org.powermock.api:powermock-api-mockito:jar:1.3.7:test
[INFO] |  \- org.powermock.api:powermock-api-support:jar:1.3.7:test
[INFO] +- org.workingonit:gwtbridge:jar:0.1:compile
[INFO] +- org.seleniumhq.selenium.client-drivers:selenium-java-testng-helper:jar:1.0.1:test
[INFO] |  \- org.seleniumhq.selenium.client-drivers:selenium-java-client-driver:jar:1.0.1:test
[INFO] +- com.dyuproject:dyuproject-util:jar:1.1-SNAPSHOT:compile
[INFO] +- com.dyuproject:dyuproject-openid:jar:1.1-SNAPSHOT:compile
[INFO] +- org.mortbay.jetty:jetty-util:jar:6.1.22:compile
[INFO] +- org.seamoo:seamoo-model:jar:1.0-SNAPSHOT:compile
[INFO] |  +- javax.jdo:jdo2-api:jar:2.3-eb:compile
[INFO] |  +- javax.transaction:jta:jar:1.1:compile
[INFO] |  \- com.google.appengine:geronimo-jpa_3.0_spec:jar:1.1.1:compile
[INFO] +- org.seamoo:seamoo-persistence:jar:1.0-SNAPSHOT:compile
[INFO] |  +- com.google.appengine.orm:datanucleus-appengine:jar:1.0.5.final:compile
[INFO] |  +- org.datanucleus:datanucleus-core:jar:1.1.5:compile
[INFO] |  \- com.google.appengine:datanucleus-jpa:jar:1.1.5:runtime
[INFO] +- org.seamoo:seamoo-theme:jar:1.0-SNAPSHOT:compile
[INFO] \- org.seamoo:seamoo-test-resources:jar:1.0-SNAPSHOT:test
[INFO]    +- com.google.appengine:appengine-api-labs:jar:1.3.1:test
[INFO]    +- com.google.appengine:appengine-api-stubs:jar:1.3.1:test
[INFO]    \- com.google.appengine:appengine-testing:jar:1.3.1:test

I can sure that I have eliminate all possible jars because when I use Open Type feature of Eclipse, it suggests only 1 class for each of DocumentBuilderFactory and DocumentBuilderFactoryImpl


回答1:


I had a similar problem with DocumentBuilderFactoryImpl. I also initially assumed the cause was a conflict in the classpath, but it was actually a result of PowerMock creating an instrumented version of the class (and having two incompatible versions of the class in the classloader). I had no luck using the @PowerMockIgnore, but eventually fixed the problem by moving any object using JAXP into non-static methods (e.g. using @Before and not @BeforeClass to instantiate the object).




回答2:


You're most likely hitting a classloader problem. Run the tests with -verbose:class to see where the classes are loaded from.




回答3:


I had the same problem with SAXParserFactoryImpl and Powemock.

javax.xml.parsers.FactoryConfigurationError: Provider com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl could not be instantiated: java.lang.ClassCastException: com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl cannot be cast to javax.xml.parsers.SAXParserFactory

I was able to fix the problem by ignoring respective classes from Powermock like this:

@PowerMockIgnore({ "org.apache.xerces.*", "javax.xml.parsers.*", "org.xml.sax.*" })


来源:https://stackoverflow.com/questions/2619880/unbelievable-cannot-cast-from-class-x-to-its-super-class

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!