我有一个现有的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,但不确定是否正确接近?
很高兴提供任何进一步的信息。 谢谢你的帮助。