通过JAX-WS WebService时截断的Java对象

时间:2013-04-17 16:57:26

标签: web-services jax-ws marshalling classcastexception

我目前正在开发一个在Java中使用JAX-WS webservices的项目。 全局主题是:用户在本地创建一个对象,比如说代理。他称第一个 webservice 并将其代理传递给Web服务。 Web服务处理代理(修改其属性:例如生命点),并将其传递给另一个Web服务。此调用是从第一个Web服务进行的,因此用户在此过程中无需执行任何操作。

在一系列Web服务链之后,用户检索已修改的代理。

我的项目的目标是设计两个部分:

  • 一个框架,它指定了前面描述的行为:webservices,Agents和迁移过程
  • 使用我的框架的演示应用程序。主要区别在于添加了GUI和新类 Avatar,它扩展了Agent 。因此,迁移过程仍然是“通过框架”,使用Agent对象完成。

以下代码显示了我如何调用我的webservice,托管我的头像,然后从服务中检索代理的简单示例:

// connection to the server
URL endpoint= new URL("http://SERVER/tomcat/KiwiBidonDynamique/ServiceWebBidonDeDadou?wsdl");
QName serviceName=new QName("http://avatar/","ServeurKiwiBidonService");
Service service = Service.create(endpoint, serviceName);
WebService port = service.getPort(WebService.class);


Avatar myAvatar = new Avatar(1, "Jack the Ripper");
port.hostAgent(myAvatar);

// some process on the service...

Avatar myAvatarTransformed = (Avatar) port.getAgent("AgentNumberOne");

当我这样做时,我在最后一行得到例外:

Exception in thread "main" java.lang.ClassCastException: agent.Agent cannot be cast to avatar.Avatar

经过大量的日志阅读后,我想原因就是webservice的工作方式。在被调用时,我在参数中给出的头像在我的JVM中编组,然后在服务上解组,但服务仅在解组时构建代理。这样做会截断特定于Avatar的数据。然后,当我尝试从服务中检索我的代理时,它无法转换为阿凡达。

有没有办法在服务上作为代理处理时保留头像信息? 我可以用某种方式编写自己的编组/解组吗?

非常感谢。

1 个答案:

答案 0 :(得分:0)

如果您的Web服务将Agent元素定义为传入数据,那么就不可能将其解组为继承类。我想有可能编写自己的编组,但它并不像听起来那么容易(我建议反对它)。要么为每个类编写一个单独的WS(杂乱),要么使传入的数据具有可以存储其他结构的元素,例如type:any(也是凌乱的)。事实是WS并不完全是OO。