我想返回一组车辆,其中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]]
因此问题仍然存在。在其他论坛上看到类似的错误,但没有人提供答案。 :(
谢谢。
最佳答案
显然,这仅发生在具有旧版本Metro(1.1)的MyEclipse中。即使我在AbstractVehicle类上指定,它也不会在客户端存根上生成@SeeAlso。如果我使用JAX-WS Metro 2.1.5及更高版本使用ant任务进行构建,则它不会出现问题。