Soap响应头元素通过JAXB解析

时间:2016-11-15 10:16:15

标签: java xml soap jaxb

我有以下soap响应头,我想从中使用JAXB解组元素的值。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:com="http://example.com" xmlns:ass="http://example.com">
    <soapenv:Header>
      <com:HeaderResponse>
         <com:RequestId>1234</com:RequestId>
      </com:HeaderResponse>
    </soapenv:Header>
    <soapenv:Body>
        ......................
    </soapenv:Body>
</soapenv:Envelope>

我尝试了很多选项,但无法获取RequestID元素的值。其中一种方法是:

package com.example.model;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "HeaderResponse", propOrder = {
    "RequestId"
})
@XmlRootElement(name = "HeaderResponse")
public class Header {
    @XmlElement(name = "RequestId",required = true)
    protected String RequestId;

    public String getRequestId() {
        return RequestId;
    }

    public void setRequestId(String RequestId) {
        this.RequestId = RequestId;
    }
}

致电代码

JAXBContext jaxbContext = JAXBContext.newInstance(Header.class);
            SOAPMessage requestMessage = MessageFactory.newInstance().createMessage(null,
                    new ByteArrayInputStream(file.getBytes()));;
            SOAPHeader reqheader = requestMessage.getSOAPHeader();
            Iterator<SOAPHeaderElement> itr = reqheader.examineAllHeaderElements();
                    while (itr.hasNext()) {
                        SOAPHeaderElement ele = itr.next();

                        Header headerType=(Header)jaxbContext.createUnmarshaller().unmarshal(ele);
                         System.out.println(headerType.getRequestId());
                    }

我得到的例外:

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://example.com", local:"HeaderResponse"). Expected elements are <{}HeaderResponse>
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(Unknown Source)
at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(Unknown Source)
at com.sun.xml.internal.bind.unmarshaller.DOMScanner.scan(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(Unknown Source)
at com.example.model.XYZ.parseAndPrintXMLTagValues(XYZ.java:69)
at com.example.main.RunJaxB.main(RunJaxB.java:18)

1 个答案:

答案 0 :(得分:0)

不要编写自己的代码。只需获取XSD文件并使用XSD文件生成java类,然后您就可以获得正确的数据: 为了参考: https://dzone.com/articles/using-jaxb-generate-java