我正在构建一个在JBoss 7.1中使用的SOAP服务。到目前为止,我只使用注释而没有生成文件的XML文件。服务器和客户端都适用于POJO。
但是,我有对象引用其他对象,我想成为SOAP响应的一部分。我可以使用@XmlElement
注释,但是当多次引用一个对象时,它也会被多次包含。我尝试使用@XmlIDREF
注释解决此问题,但这会在客户端产生NULL
对象。
我创建了一个独立的示例,其中Wheel
个对象引用了它们所属的Bike
,还有一个服务来检索所有轮子(这是一个简短的,不完整的代码。请参阅下面的链接到实际代码):
@WebService
public interface IWheelService {
Collection<Wheel> getAllWheels();
}
public class Wheel extends XmlEntity {
private String type;
private Bike bike;
public Wheel(Bike bike, String type) {
this.bike = bike;
this.type = type;
}
@XmlIDREF
public Bike getBike() {
return bike;
}
@XmlElement
public String getType() {
return type;
}
}
public class Bike extends XmlEntity {
private String color;
public Bike(String color) {
this.color = color;
}
public String getColor() {
return color;
}
}
public abstract class XmlEntity implements Serializable {
public static int idGenerator = 0;
private int id = idGenerator++;
@XmlTransient
public int getId() {
return id;
}
@XmlID
@XmlAttribute(name = "id")
@Transient
public String getXmlId() {
return String.format("%s:%d", this.getClass().getSimpleName(), this.id);
}
}
此示例的完整代码可用here。
下面是SOAP响应,包含车轮的正确自行车ID,但不包含实际的自行车元素。因此wheel.getBike()
将始终在客户端上返回NULL
。
是否有注释使JAX-WS发送所有相关对象?或者至少在客户端获取自行车ID,以便我可以使用第二个SOAP请求检索它们?
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:getAllWheelsResponse xmlns:ns2="http://demo/">
<return id="Wheel:1">
<bike>Bike:0</bike>
<type>slick</type>
</return>
<return id="Wheel:2">
<bike>Bike:0</bike>
<type>spike</type>
</return>
</ns2:getAllWheelsResponse>
</S:Body>
</S:Envelope>