火星文 技术研习社

Noname Cat, Keep Thinking
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

解决:XFireFault: Could not marshall type

Posted on 2007-06-26 00:16  剑廿三  阅读(3167)  评论(0编辑  收藏  举报
版本:XFire 1.2.2
IDE:MyEclipse 5.1GA
JDK:Sun JDK 1.6.0

问题现象:

编制某电信级航空服务客户端时固定地出现以下异常:

Exception in thread "main" org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: Could not marshall type.

Caused by: javax.xml.bind.JAXBException: com.SomeDomain.SomeObject nor any of its super class is known to this context

问题出现在注入 “XXXXXRequest” 对象并触发 Web 服务的瞬间。

搜索 Google 得不到有帮助的答复,找不到相关的中文资料。之前使用 Axis 1.1 编写的客户端运行正常。

问题原因:

在相同一个源码包内使用 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 5.5.1 GA