SOAP信封中的marshal / wrap xml

时间:2016-08-30 07:17:36

标签: java xml soap jaxb annotations

我有一个现有的xml有效负载,我必须使用soap信封包装,目前我正在尝试使用带注释的java类构建soap信封。它在消息服务中使用JAXB封送到xml。

我使用注释的当前问题是 1. xml命名空间分配给soap信封而不是子元素(MQRequest元素)中的属性。 2.如何将xsi分配给复杂元素(传输元素)。

<SOAP-ENV:Envelope xmlns:SOAPENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
    <MQRequest xmlns="http://group.com/abc/wsdl/ABCService">
    <requestHeader xmlns="">
            <ns1:ESBRequestId xmlns:ns1="http://group.com/abc/schema/Header" />
            <ns2:ClientAudit xmlns:ns2="http://group.com/abc/schema/Header">
                <ns2:ClientApplication></ns2:ClientApplication>
                <ns2:ClientReferenceId></ns2:ClientReferenceId>
                <ns2:RequestDateTime></ns2:RequestDateTime>
            </ns2:ClientAudit>
            <ns3:Transport xmlns:ns3="http://group.com/abc/schema/Header"
                xsi:type="ns3:MQTransport">
                <ns3:QueueManager />
                <ns3:ResponseQueueName />
                <ns3:MessageFormat></ns3:MessageFormat>
                <ns3:MQMessageId />
                <ns3:TimeToLive></ns3:TimeToLive>
            </ns3:Transport>
            <ns4:Operation xmlns:ns4="http://group.com/abc/schema/Header">
                <ns4:ServiceName></ns4:ServiceName>
                <ns4:InterfaceName></ns4:InterfaceName>
                <ns4:OperationName></ns4:OperationName>
            </ns4:Operation>
        </requestHeader>
        <Msg xmlns=""></Msg>

这是我目前能够复制的内容。

<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"   xmlns:ns0="http://group.com/abc/wsdl/ABCService" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
    <MQRequest>
        <requestHeader>
            <ESBRequestId/>
            <ClientAudit>
                <ClientApplication></ClientApplication>
                <ClientReferenceId></ClientReferenceId>
                <RequestDateTime></RequestDateTime>
            </ClientAudit>
            <Transport>
                <QueueManager/>
                <ResponseQueueName/>
                <MessageFormat></MessageFormat>
                <MQMessageId/>
                <TimeToLive></TimeToLive>
            </Transport>
            <Operation>
                <ServiceName></ServiceName>
                <InterfaceName></InterfaceName>
                <OperationName></OperationName>
            </Operation>
        </requestHeader>
        <Msg>
        </Msg>
    </MQRequest>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

正如您所看到的,MQRequest的命名空间正被推送到信封中。 Java代码如下。

@XmlRootElement(name = "Envelope")
public class SoapEnvelope implements RequestMessage {

  @XmlElement(name = "Body")
  private SoapBody soapBody;

  public SoapEnvelope(SoapBody soapBody) {
    this.soapBody = soapBody;
  }

  public SoapEnvelope() {
  }
}

我使用@xmlSchema和信封类,我把它放在一个单独的包中给其他请求元素。

@XmlSchema(
    namespace = "http://schemas.xmlsoap.org/soap/envelope/",
    elementFormDefault = XmlNsForm.QUALIFIED,
    xmlns = {
        @XmlNs(prefix="SOAP-ENV", namespaceURI="http://schemas.xmlsoap.org/soap/envelope/"),
        @XmlNs(prefix="xsi", namespaceURI="http://www.w3.org/2001/XMLSchema-instance"),
        @XmlNs(prefix="xsd", namespaceURI="http://www.w3.org/2001/XMLSchema")
    }
)

@XmlRootElement(name = "Body")
public class SoapBody {

  @XmlElement(name = "MQRequest")
  AbcRequest abcRequest;

  public SoapBody(AbcRequest abcRequest) {
    this.abcRequest = abcRequest;
  }

  public SoapBody() {
  }
}

@XmlRootElement(name = "MQRequest")
@XmlType(namespace="http://group.com/abc/wsdl/ABCService")
public class AbcRequest implements RequestMessage {

  @XmlElement(name = "requestHeader")
  private AbcRequestHeader header;

  @XmlElement(name = "Msg")
  private MsgPayload msgPayload;

  public AbcRequest() {

  }
}

我尝试使用package-info和@xmlSchema,但获得了类似的结果。在requestHeader中分配头名称空间(http://group.com/abc/schema/Header)时,我也遇到同样的问题,它传播到包络并将“ns0:”分配给所有元素而不是ns1,ns2等。

我提到的第二个问题与以下内容有关。

<ns3:Transport xmlns:ns3="http://group.com/abc/schema/Header"
                    xsi:type="ns3:MQTransport">

我只是不确定如何分配xsi:type属性?我已阅读此http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-xsitype.html,但不确定是否正确接近?

很高兴提供任何进一步的信息。 谢谢你的帮助。

0 个答案:

没有答案