启动WebSphere时,我遇到了这个异常:
Could not instantiate bean class [org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter]:
Constructor threw exception; nested exception is java.lang.ClassCastException:
com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl incompatible with
javax.xml.transform.TransformerFactory
Caused by: java.lang.ClassCastException: com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl
incompatible with javax.xml.transform.TransformerFactory
at javax.xml.transform.TransformerFactory.newInstance(Unknown Source)
at org.springframework.http.converter.xml.AbstractXmlHttpMessageConverter.<init>(AbstractXmlHttpMessageConverter.java:47)
at org.springframework.http.converter.xml.SourceHttpMessageConverter.<init>(SourceHttpMessageConverter.java:45)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.<init>(AnnotationMethodHandlerAdapter.java:197)
这似乎对我的applicationContext.xml中的任何bean没有任何影响,但它仍然很奇怪。对我来说,这看起来好像IBM类正在泄漏到我的应用程序中。
我该如何解决这个问题?我已经将“访问内部服务器类”选项设置为“限制”。
答案 0 :(得分:1)
这确实是一个类加载问题,但是这不能通过更改类加载器设置来解决。
问题是xml-apis和javax.xml jar正在通过某些maven依赖项导入。
由于我们已经将应用程序的类加载器策略设置为PARENT_LAST,因此从我们的jar文件中的WebApp-Class加载器加载了javax.xml.transform.TransformerFactory。 但是它的实现'com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl'来自服务器类加载器,这个加载器链接到JDK / JRE提供的javax.xml.transform.TransformerFactory。
由于类是从不同的源加载的,因此抛出了ClassCastException。
删除对xml-apis / xerces / javax.xml jars的所有依赖项解决了这个问题。 由于这些API现在是JDK的一部分,因此不再需要导入它们。
......如果你想知道为什么我对这个问题了解得太多:我和Aaron一起工作。 ;)
答案 1 :(得分:0)
我不能代表Restrict,因为我没有个人经验,但我认为这个问题更多地与IBM Class Loader有关。您所指的类是TransformerFactory的IBM Java实现的一部分,我认为您可以尝试以下其中一项来解决此问题
答案 2 :(得分:0)
为什么说IBM类正在泄漏到您的应用程序中?
要求TransformerFactory创建一个newInstance。它遵循一系列步骤来确定要使用的TransformerFactory。如果没有指定配置,它只选择使用默认工厂。
这是TransformerFactory的javadoc: http://download.oracle.com/javase/1.5.0/docs/api/javax/xml/transform/TransformerFactory.html#newInstance()
什么是操作系统?那是AIX吗?
http://www.ibm.com/developerworks/java/jdk/aix/j664/sdkguide.aix64.html
查看AIX的这个doc(上面的链接),它告诉我这是默认的Impl:
javax.xml.transform.TransformerFactory中 选择XSLT处理器。可能的值是: com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl 使用XL TXE-J编译器。该值是默认值。
回发其他信息,以便我们对此进行排查。
HTH Manglu