加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

cxf调用.net中的接口遇到的两个问题

发布时间:2020-12-17 01:02:12 所属栏目:安全 来源:网络整理
导读:在使用CXF中,由于服务器使用的是.net开发中,由于之前没有调用过,所以按一般的CXF的调用方法进行调用,发现出现了一个问题,报如下的错误: Exception in thread "main" javax.xml.ws.soap.SOAPFaultException : 无法识别请求元素 , 后面是一个 xml 的片段 这个

在使用CXF中,由于服务器使用的是.net开发中,由于之前没有调用过,所以按一般的CXF的调用方法进行调用,发现出现了一个问题,报如下的错误:

Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: 无法识别请求元素,后面是一个xml的片段

这个问题的原因是因为.net中采用了命名空间.所以需要在我的接口中将命名空间加上,我是直接在类上采用注解的方式把命名空间加上,命名空间的内容从哪里来,这个可以通过wsdl文档中发现.我的修改的示例如下:

@WebService(targetNamespace = "http://soap.interfaces.ssa.huawei.com")

publicinterface ICorePlat {

}

在targetNamespace中修改为WSDL文档中的命名空间即可解决上述的问题.

然后继续进行调用,又出现了另外的问题,报如下错误:

Exception in thread"main" java.lang.NullPointerException

??? at$Proxy28.sendSMS(Unknown Source)

??? atcom.feinno.gdp.promgr.ws.ws.Client.main(Client.java:66)

这个原因找了半天,最开始怀疑是java编译器的原因,因为我已经接收到了SOAP返回的片段,里面有我想要的结果,却偏偏无法返回至java对象中,最后发现.net服务器中对返回的参数进行命名,所以需要对返回结果进行注解,整个接口的示例如下:

@WebService(targetNamespace = "http://soap.interfaces.ssa.huawei.com")

publicinterface ICorePlat {

??? @WebResult(name="out")?

??? publiclong sendSMS(InfoHeader header,String sessionId,Stringsender,String smsContent,

?????????? String receiverList,String productCode,StringpseudoFlag);

???

}

经过了上面的修改之后,编译运行似乎没有问题了,但是调用的结果始终有问题,在网上也查了下,发现传输的参数也需要进行命名,所以将其改为如下的代码:

@WebService(targetNamespace = "http://soap.interfaces.ssa.huawei.com")

publicinterface ICorePlat {

??? @WebResult(name = "out")

??? publiclong sendSMS(

?????????? @WebParam(name = "in0")InfoHeader in0,

?????????? @WebParam(name = "in1")Stringin1,

?????????? @WebParam(name = "in2")Stringin2,

?????????? @WebParam(name = "in3")Stringin3,

?????????? @WebParam(name = "in4")Stringin4,

?????????? @WebParam(name = "in5")Stringin5,

?????????? @WebParam(name = "in6")Stringin6);

???

}

经过上面的修改之后,仍然是不能返回正确结果的,虽然运行不会产生错误,但仍然表明有地方不对劲儿.后面发现wsdl文件中有这么一句话:

<s:importnamespace="http://bean.interfaces.iiss.huawei.com"/>

也就是说引入了一个新的命名空间,这个在我生成的SOAP片段中没有出现,于是继续进行修改,最后的办法是在ICorePlat这个类的同一个包下加入这样一个特殊的类就可以了,这个类类名叫: pacakge-info.java,里面的内容是:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://bean.interfaces.iiss.huawei.com",elementFormDefault =javax.xml.bind.annotation.XmlNsForm.QUALIFIED)

package com.xxxx.xxxx.xxxx.ws.client;

xxxx表示项目的包名

至于为什么需要加入这样的类,是因为cxf在进行SOAP传输与解析时,通过该类对SOAP内容进行了命名空间的添加.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读