当Spring尝试创建AnnotationMethodHandlerAdapter时,WebSphere中的XSLT ClassCastException

当Spring尝试创建AnnotationMethodHandlerAdapter时,WebSphere中的XSLT ClassCastException,spring,xslt,spring-mvc,websphere,classcastexception,Spring,Xslt,Spring Mvc,Websphere,Classcastexception,启动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.Tran

启动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)
无法实例化bean类[org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter]:
构造函数抛出异常;嵌套异常为java.lang.ClassCastException:
com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl与不兼容
javax.xml.transform.TransformerFactory
原因:java.lang.ClassCastException:com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl
与javax.xml.transform.TransformerFactory不兼容
位于javax.xml.transform.TransformerFactory.newInstance(未知源)
位于org.springframework.http.converter.xml.AbstractXmlHttpMessageConverter。(AbstractXmlHttpMessageConverter.java:47)
位于org.springframework.http.converter.xml.SourceHttpMessageConverter.(SourceHttpMessageConverter.java:45)
位于org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.(AnnotationMethodHandlerAdapter.java:197)
这似乎对applicationContext.xml中的任何bean都没有任何影响,但仍然很奇怪。对我来说,这看起来好像IBM类正在泄漏到我的应用程序中


我怎样才能解决这个问题?我已经将“访问内部服务器类”选项设置为“限制”。

我不能支持限制,因为我个人没有使用限制的经验,但我认为问题更多地与限制有关。您所指的类是TransformerFactory的IBMJava实现的一部分,我认为您可以尝试以下方法之一来解决这个问题

  • 或者将服务器类加载器策略更改为PARENT_LAST(这样,类加载器将从应用程序的本地类路径找到类,然后再向上一直到java运行时)
  • 另一个选项是查看jaxp.properties文件,我想它位于(was_root\java\jre\lib),我只知道这个选项,实际上从未使用过它

  • 为什么说IBM类正在泄漏到您的应用程序中

    要求TransformerFactory创建一个新实例。它遵循一系列步骤来确定要使用哪个TransformerFactory。如果没有指定任何配置,它只选择使用默认工厂

    以下是TransformerFactory的javadoc: ()

    什么是操作系统?那是AIX吗

    查看这个AIX文档(上面的链接),它告诉我这是默认的Impl:

    javax.xml.transform.TransformerFactory 选择XSLT处理器。可能的值为: com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl 使用XL TXE-J编译器。此值是默认值

    发回其他信息,以便我们可以尝试并解决此问题


    Manglu

    这确实是一个类加载问题,但是这不能通过更改类加载程序设置来解决

    问题是XMLAPI和javax.xml jar是通过一些maven依赖项导入的

    因为我们已经将应用程序的类加载器策略设置为PARENT_LAST,所以javax.xml.transform.TransformerFactory是从我们的jar文件中的WebApp类加载器加载的。 然而,它的实现'com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl'来自服务器类加载器,这个实现链接到JDK/JRE提供的javax.xml.transform.TransformerFactory

    因为类是从不同的源加载的,所以抛出了一个ClassCastException

    删除对XMLAPI/xerces/javax.xml jars的所有依赖关系解决了这个问题。 由于这些API现在是JDK的一部分,因此不再需要导入它们

    。。。如果你想知道为什么我对这个问题了解这么多:我和亚伦一起工作