SOAP報文轉成JAVA對象

在今天之前我尚未用過代碼解析過SOAP報文,更別提轉成JAVA對象了,今天的任務中報文這個模樣的,(爲防止數據信息,如下數據我故意打亂了防止泄露什麼信息.)html

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="urn:WSSOP">
    <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        <ns2:CallWSSOP>
            <objInputData>
                <m-strOrderID>2019123041123509590670</m-strOrderID>
                <m-strSerialNumber>85213365571107</m-strSerialNumber>
                <nPriority>0</nPriority>
                <m-strSwitchid>C123L21231302</m-strSwitchid>
                <m-vServList>
                    <m-strServName>YYH1232</m-strServName>
                </m-vServList>
                <m-vVarList>
                    <m-strName>G012302</m-strName>
                    <m-strValue>455020096628454</m-strValue>
                </m-vVarList>
                <m-vVarList>
                    <m-strName>G123004</m-strName>
                    <m-strValue>85361235571107</m-strValue>
                </m-vVarList>
                <m-vVarList>
                    <m-strName>G123071</m-strName>
                    <m-strValue>0085123265571107</m-strValue>
                </m-vVarList>
            </objInputData>
        </ns2:CallWSSOP>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

 

上面是使用POSTMAN美化以後的報文樣子,最開始的報文模樣是這樣的java

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="urn:WSSOP"><SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><ns2:CallWSSOP><objInputData><m-strOrderID>2019041509590670</m-strOrderID><m-strSerialNumber>85365571107</m-strSerialNumber><nPriority>0</nPriority><m-strSwitchid>CL02</m-strSwitchid><m-vServList><m-strServName>YYH2</m-strServName></m-vServList><m-vVarList><m-strName>G002</m-strName><m-strValue>455020096628454</m-strValue></m-vVarList><m-vVarList><m-strName>G004</m-strName><m-strValue>85365571107</m-strValue></m-vVarList><m-vVarList><m-strName>G071</m-strName><m-strValue>0085265571107</m-strValue></m-vVarList></objInputData></ns2:CallWSSOP></SOAP-ENV:Body></SOAP-ENV:Envelope>

 

一.美化報文

美化報文不是爲了別人,是爲了本身看起來方便一點點,有助於瞭解對象結構。  美化工具可能不少,手邊的工具可能就POSTMAN,就以這個爲例了,相信人手都會裝有一個。api

在POSTMAN中隨意打開一個,Body裏面貼上原始報文,而後調成XML, 點擊Beauty便可美化報文.oracle

image

 

wsdl文件

  因爲組長髮給個人文檔裏面沒有這個SOAP的地址,只有一份接口參數說明以及wsdl文件,接口地址暫時還沒給我,因此咱們利用wsdl文件生成java實體類,soap的url也是同樣的效果.工具

如下是操做步驟,將wsdl文件放到工程的某個文件目錄下,右擊 WebService—>Generate  Java Code from wsdl  (這裏指定wsdl路徑應該是同樣的效果)—>  選定 Axis2  和 JaxB,以及生成的目錄便可,可是每次生成位置稍有不對,手動移下就好了,這樣就生成了Java對象.ui

image

 

四.採坑的點

  不知道爲何按照StackOverFlow啊、博客方法,解析總會存在問題;而別人好像又可以解析成功,可能每一個人的報文不同的緣由,https://stackoverflow.com/questions/19395400/jaxb-unmarshall-with-namespaces-and-prefix  . url

   按照別人寫的直接獲取SoapBody在使用extractContentAsDocument方法,就可以解析成功,而到了我這裏解析下來java實體類中全部屬性都是空的,因而我就想到的上面的方式,這樣加入SoapBody中存在多個屬性,好比和CallWSSOP同級的java類,也可以解析出來.spa

   另外我嘗試了很久去利用@XmlNs發現,這個註解好像根本不起做用,這裏面待研究的好多,可是之後碰到像我遇到這麼複雜的報文,解析方式按照上面來就能夠啦.code

 

  附上Marsharl  API官網一份,https://docs.oracle.com/javase/7/docs/api/javax/xml/bind/Marshaller.htmlxml

相關文章
相關標籤/搜索