确切的问题:
我有一个在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 起,saaj实现在jre本身中提供,因此我们不需要单独的jar。
因此,我得到了classcast异常。我想通过强制类路径从外部获取saaj jar而不是jre本身中的一个来解决此问题。
最佳答案
嗯...我在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解决了我的问题,但不允许更改生产服务器的启动脚本。
关于java - 如何告诉Java 8使用我自己的库而不是内部库?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44774390/