使用 MyEclipse的XFire1.2.06 生成客户端后,对其进行测试时,出现错误:
Exception in thread "main" org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: Could not marshall type.
问题原因:
在相同一个源码包内使用 XFire 对同一台服务器上路径相似、命名空间相同的两个 Web 服务生成 Web 服务客户端时,后生成的客户端程序会覆盖前一个客户端程序的 ObjectFactory.java,该 java 文件为 XFire 提供针对 Web 服务所使用的 Request 和 Response 对象的解释,当使用 MyEclipse 5.x 产生客户端时,ObjectFactory.java 只包含最近一次生成的客户端的 Request 和 Response 对象,而覆盖或舍弃了前一次生成的客户端的 Request 和 Response 对象,导致客户端运行时无法解释前一次生成的客户端的 Request 和 Response 对象,从而抛出 XFireFault: Could not marshall type 异常。
解决方案:
每次生成一个 Web 服务客户端后,对负责 Request 和 Response 对象的 ObjectFactory.java 作一次备份,当使用 MyEclipse 5.x 生成同一个命名空间下的全部 Web 服务客户端之后,手工合并这些备份的 ObjectFactory.java 为最终版本的 ObjectFactory.java 。
建议升级到:
版本:XFire 1.2.6
IDE:MyEclipse 6.0