SOAP Web服务:SOAP结果中对同一对象的多个引用

时间:2013-05-14 10:30:19

标签: java soap jax-ws jax-rs jboss7.x

我正在构建一个在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>

0 个答案:

没有答案