在今天以前我還沒有用過代碼解析過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即可美化報文.
wsdl文件
由於組長發給我的文檔里面沒有這個SOAP的地址,只有一份接口參數說明以及wsdl文件,接口地址暫時還沒給我,所以我們利用wsdl文件生成java實體類,soap的url也是一樣的效果.
以下是操作步驟,將wsdl文件放到工程的某個文件目錄下,右擊 WebService—>Generate Java Code from wsdl (這里指定wsdl路徑應該是一樣的效果)—> 選定 Axis2 和 JaxB,以及生成的目錄即可,但是每次生成位置稍有不對,手動移下就行了,這樣就生成了Java對象.
四.采坑的點
不知道為什么按照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