SOAP报文转成JAVA对象

Posted 喜欢日向雏田一样的女子啊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于SOAP报文转成JAVA对象的主要内容,如果未能解决你的问题,请参考以下文章

java怎么解析文本文件中的soap报文

怎么把一个java对象转换成soap

soap设置报文头值 java

java使用POST发送soap报文请求webservice返回500错误解析

java如何打印webservice 发送的soap报文协议

java 查看SOAP请求报文