我正在构建要在 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);
}
}
此示例的完整代码可在此处获得。
下面是 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>