SOAP報文轉成JAVA對象


在今天以前我還沒有用過代碼解析過SOAP報文,更別提轉成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>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美化之后的報文樣子,最開始的報文模樣是這樣的

<?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,就以這個為例了,相信人手都會裝有一個。

在POSTMAN中隨意打開一個,Body里面貼上原始報文,然后調成XML, 點擊Beauty即可美化報文.

image

 

wsdl文件

  由於組長發給我的文檔里面沒有這個SOAP的地址,只有一份接口參數說明以及wsdl文件,接口地址暫時還沒給我,所以我們利用wsdl文件生成java實體類,soap的url也是一樣的效果.

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

image

 

四.采坑的點

  不知道為什么按照StackOverFlow啊、博客方法,解析總會存在問題;而別人好像又能夠解析成功,可能每個人的報文不一樣的原因,https://stackoverflow.com/questions/19395400/jaxb-unmarshall-with-namespaces-and-prefix  . 

   按照別人寫的直接獲取SoapBody在使用extractContentAsDocument方法,就能夠解析成功,而到了我這里解析下來java實體類中所有屬性都是空的,於是我就想到的上面的方式,這樣加入SoapBody中存在多個屬性,比如和CallWSSOP同級的java類,也能夠解析出來.

   另外我嘗試了好久去利用@XmlNs發現,這個注解好像根本不起作用,這里面待研究的好多,但是以后碰到像我遇到這么復雜的報文,解析方式按照上面來就可以啦.

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM