簡體   English   中英

Jaxb 解組 SOAP 信封

[英]Jaxb Unmarshall SOAP Envelope

我知道已經有類似的帖子,但沒有一個對我有幫助。

我在反序列化/解組 xml 時遇到問題。

我的代碼如下所示:

public class SoapTest {

    public static String passarXMLParaString(Document xml, int espacosIdentacao){
        try {
            //set up a transformer
            TransformerFactory transfac = TransformerFactory.newInstance();
            transfac.setAttribute("indent-number", new Integer(espacosIdentacao));
            Transformer trans = transfac.newTransformer();
            trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
            trans.setOutputProperty(OutputKeys.INDENT, "yes");

            //create string from xml tree
            StringWriter sw = new StringWriter();
            StreamResult result = new StreamResult(sw);
            DOMSource source = new DOMSource(xml);
            trans.transform(source, result);
            String xmlString = sw.toString();
            return xmlString;
        }
        catch (TransformerException e) {
            e.printStackTrace();
            System.exit(0);
        }
        return null;
    }


    public static void main(String[] args) throws SOAPException, IOException, JAXBException {

        // consumes
        String requestSoap;
        requestSoap =  "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:cli=\"http://cliente.bean.master.sigep.bsb.correios.com.br/\">\r\n" + 
                "   <soapenv:Header/>\r\n" + 
                "   <soapenv:Body>\r\n" + 
                "      <cli:consultaCEP>\r\n" + 
                "         <cep>38706400</cep>\r\n" + 
                "      </cli:consultaCEP>\r\n" + 
                "   </soapenv:Body>\r\n" + 
                "</soapenv:Envelope>";

        SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
        SOAPConnection soapConnection = soapConnectionFactory.createConnection();
        String url = "https://apps.correios.com.br/SigepMasterJPA/AtendeClienteService/AtendeCliente";
        MimeHeaders headers = new MimeHeaders();
        headers.addHeader("Content-Type", "text/xml");

        MessageFactory messageFactory = MessageFactory.newInstance();
        SOAPMessage msg = messageFactory.createMessage(headers, (new ByteArrayInputStream(requestSoap.getBytes())));
        SOAPMessage soapResponse = soapConnection.call(msg, url);
        Document xmlRespostaARequisicao = soapResponse.getSOAPBody().getOwnerDocument();
        String xml = passarXMLParaString(xmlRespostaARequisicao, 0);
        System.out.println(passarXMLParaString(xmlRespostaARequisicao, 0));

        // returns null
        JAXBContext jc = JAXBContext.newInstance(CepResponse.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        CepResponse response = (CepResponse) unmarshaller.unmarshal(soapResponse.getSOAPBody().extractContentAsDocument().getDocumentElement());
        System.out.println(response.bairro);
    }

}

這種消費的回報是:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:consultaCEPResponse xmlns:ns2="http://cliente.bean.master.sigep.bsb.correios.com.br/">
         <return>
            <bairro>Cidade Nova</bairro>
            <cep>38706400</cep>
            <cidade>Patos de Minas</cidade>
            <complemento2>- até 729/730</complemento2>
            <end>Avenida Presidente Tancredo Neves</end>
            <uf>MG</uf>
         </return>
      </ns2:consultaCEPResponse>
   </soap:Body>
</soap:Envelope>

但是執行 urnmarshal 會返回 null。

我的 model class:

@XmlRootElement(name = "consultaCEPResponse", namespace = "http://cliente.bean.master.sigep.bsb.correios.com.br/")
@XmlAccessorType(XmlAccessType.FIELD)
public class CepResponse {

    @XmlElement(name="bairro")
    String bairro;

}

我嘗試過其他類型的解組,但沒有用。 你能幫我嗎?

謝謝你。

問題是bairro的 xpath 是/consultaCEPResponse/return/bairro JAXB 字段bairro應該嵌套在另一個表示<return>標簽的 class 中。

@XmlRootElement(name = "consultaCEPResponse", namespace = "http://cliente.bean.master.sigep.bsb.correios.com.br/")
@XmlAccessorType(XmlAccessType.FIELD)
public static class CepResponse {

    @XmlElement(name = "return")
    Return returnTag;

    @XmlAccessorType(XmlAccessType.FIELD)
    public static class Return {
        @XmlElement(name="bairro")
        String bairro;
    }
}

bairro可通過response.returnTag.bairro訪問

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM