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

Java SOAP Web服务:SOAP结果中对同一对象的多个引用,java,soap,jax-ws,jax-rs,jboss7.x,Java,Soap,Jax Ws,Jax Rs,Jboss7.x,我正在构建一个用于JBoss7.1的SOAP服务。到目前为止,我只使用注释,没有生成文件的XML文件。对于POJO,服务器和客户端都可以正常工作 但是,我有引用其他对象的对象,我希望这些对象是SOAP响应的一部分。我可以使用@XmlElement注释,但是当一个对象被多次引用时,它也会被多次包含。我试图通过使用@XmlIDREF注释来解决这个问题,但这会导致客户端出现NULL对象 我创建了一个独立的示例,其中车轮对象引用了它们所属的自行车,并创建了一个检索所有车轮的服务。这是一个简短、不完整的代

我正在构建一个用于JBoss7.1的SOAP服务。到目前为止,我只使用注释,没有生成文件的XML文件。对于POJO,服务器和客户端都可以正常工作

但是,我有引用其他对象的对象,我希望这些对象是SOAP响应的一部分。我可以使用@XmlElement注释,但是当一个对象被多次引用时,它也会被多次包含。我试图通过使用@XmlIDREF注释来解决这个问题,但这会导致客户端出现NULL对象

我创建了一个独立的示例,其中车轮对象引用了它们所属的自行车,并创建了一个检索所有车轮的服务。这是一个简短、不完整的代码。有关实际代码的链接,请参见下文:

@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);
    }
}
<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>