确切问题: 我有一个在Windows 2003中运行的应用程序(jre 1.5) 现在它已迁移到Windows 2012(jre 1.8)服务器。当发生以下异常时,
Caller.main:com.sun.xml.internal.messaging.saaj.soap.ver1_1.Message1_1Impl无法强制转换为com.sun.xml.messaging.saaj.soap.MessageImpl
旧服务器使用 jre 1.5 ,新服务器使用较新的1.8 。在 jre 1.5 ,我们分别有 saaj jars 。
从 java 6 开始,ja本身提供了saaj实现,我们不需要单独的jar。 因此,我得到了classcast异常。我想通过强制类路径从外部获取saaj jar而不是jre本身的那个来解决这个问题。
答案 0 :(得分:2)
嗯......我在weblogic中遇到了问题,不得不更改SAAJ的默认实现(默认实现已经破坏了!)
为了在weblogic中实现这一点,我将其添加到启动weblogic的命令行:
-Djavax.xml.soap.MessageFactory=com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl
所以,对你来说,应该是这样的:
-Djavax.xml.soap.MessageFactory=com.sun.xml.messaging.saaj.soap.MessageFactoryImpl
它应该工作。这样就告诉JVM哪个是SAAJ消息的默认工厂。
PS:嗯,说实话,他们有更多的方法在没有触及启动脚本的情况下在weblogic中更改它,我结束了更改代码并手动设置了没有被破坏的MessageFactoryImpl版本。我发现-Djavax.xml.soap.MessageFactory解决了我的问题,但我不允许更改生产服务器的启动脚本。答案 1 :(得分:0)
最后,我找到了一个解决方案及其工作原理。 使用java选项 -Xbootclasspath ,我们可以实现这一目标。
解决方案:
java -Xbootclasspath/p:.\jaxrpc16\saaj-api.jar;.\jaxrpc16\saaj-impl.jar -classpath <myClasses> <myMainClass>
参考: https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javac.html
P.S:需要对此进行更多研究,以确保此选项是否安全可靠。