Веб-сервисы (JAX-WS) и наследование - PullRequest
1 голос
/ 03 июня 2011

Я хотел бы вернуть коллекцию транспортных средств, где 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 / .Дайте мне знать, если вам нужна другая информация.

ОБНОВЛЕНИЕ:

После того, как я добавил @XmlSeeAlso ({Car.class, Motorbyte.class}) в класс AbstractVehicle, яя вижу, 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 голосов
/ 05 июля 2011

Видимо, это происходит только в MyEclipse, где установлена ​​старая версия Metro (1.1).Он не генерирует @SeeAlso на клиентских заглушках, даже если я указал класс AbstractVehicle.Если я собираюсь с помощью задачи Ant с использованием JAX-WS Metro 2.1.5 и выше, он работает без проблем.

...