Web服务(JAX-WS)和继承

时间:2011-06-03 15:31:09

标签: java web-services inheritance jax-ws

我想返回一组车辆,其中AbstractVehicle是Car和Motorbyte类的父级。

如果我只有

   public Collection<AbstractVehicle> getVehicles() {
          Collection<AbstractVehicle> ret = new ArrayList<AbstractVehicle>();
          ret.add(new Car());
          ret.add(new Motorbyte());
          return ret;
   }

我将获得仅为AbstractVehicle的结果。

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:getVehiclesResponse xmlns:ns2="http://webservice.delegator.stp.mimos.my/">
<return>
  <weight>0</weight> 
  </return>
<return>
  <weight>0</weight> 
  </return>
  </ns2:getVehiclesResponse>
  </S:Body>
  </S:Envelope>

如果我添加了一个包含子类的伪方法,

public boolean setAll(Car car, Motorbyte mb) {
              return true;
       }

getVehicles将返回真正子类的结果。

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:getVehiclesResponse xmlns:ns2="http://webservice.delegator.stp.mimos.my/">
<return xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:car">
  <weight>0</weight> 
  <numOfSaftyBelts>0</numOfSaftyBelts> 
  </return>
<return xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:motorbyte">
  <weight>0</weight> 
  </return>
  </ns2:getVehiclesResponse>
  </S:Body>
  </S:Envelope>

为什么它会以这种方式表现?任何替代方法都可以通过虚拟方法获得正确的结果? 仅供参考,我正在使用Metro http://jax-ws.java.net/。如果您需要其他信息,请告诉我。

更新

在AbstractVehicle类上添加@XmlSeeAlso({Car.class,Motorbyte.class})之后,我发现即使没有虚拟方法,SOAP也会返回正确的类型。但是,在我的客户端,我收到了以下错误:

Exception in thread "main" com.sun.xml.ws.encoding.soap.DeserializationException: Failed to read a response: javax.xml.bind.UnmarshalException
 - with linked exception:
[javax.xml.bind.UnmarshalException: Unable to create an instance of my.mimos.stp.delegator.webservice.client.AbstractVehicle
 - with linked exception:
[java.lang.InstantiationException]]

所以这个问题仍然存在。在其他论坛上看到类似的错误,但没有人提供答案。 :(

感谢。

1 个答案:

答案 0 :(得分:0)

显然,这只发生在拥有旧版Metro(1.1)的MyEclipse中。即使我在AbstractVehicle类上指定,它也不会在客户端存根中生成@SeeAlso。如果我使用JAX-WS Metro 2.1.5及更高版本构建ant任务,那么它无问题。