Я хотел бы вернуть коллекцию транспортных средств, где 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]]
Так что проблема все еще открыта.Смотрите похожие ошибки на других форумах, но никто не дает ответа.: (
Спасибо.