如何在cxf中获取soap报文,工作中

如何在cxf中获取soap报文,工作中,第1张

解答在CXF google中有一个帖子“请问如何用cxf在请求中加header信息“

由于需要记录访问services的client。需要从SOAP消息中获取Header的数据。具体的方法如下:

server:

Java代码

public class LoggingInterceptor extends AbstractPhaseInterceptor<SoapMessage>{

Log logger = LogFactory.getLog(LoggingInterceptor.class)

private SAAJInInterceptor saajIn = new SAAJInInterceptor()

public LoggingInterceptor() {

super(Phase.PRE_PROTOCOL)

getAfter().add(SAAJInInterceptor.class.getName())

}

public void handleMessage(SoapMessage message) throws Fault {

try {

logger.info("记录访问web services日志")

SOAPMessage doc = message.getContent(SOAPMessage.class)

if (doc == null) {

saajIn.handleMessage(message)

doc = message.getContent(SOAPMessage.class)

}

SOAPHeader header = doc.getSOAPHeader()

if (header == null) {

return

}

NodeList nodes = header.getElementsByTagName("proc:user")

for(int i=0i<nodes.getLength()i++) {

System.out.println(nodes.item(i).getLocalName()+"----"+nodes.item(i).getTextContent())

}

} catch (SOAPException e) {

e.printStackTrace()

}

}

}

CXF本身应该有更方便的方式进行添加,去读读文档。

我当时也遇到这个问题,时间太紧我没时间读文档,用了一个很笨很直接的办法:

我当时的场景:对方服务是用.net开发的,我用JAVA&CXF,他自己用.net很顺序地能调通,我用CXF就不行。

我的笨办法:

1、我搞到别人能调通的SOAP报文

2、抓到我CXF调用发出的报文;

3、比较两者之不同;

4、然后自己在拦截器中把差的报文节点补齐;

5、搞定。(看起来复杂,其实没花多少时间)

代码虽然还一翻就找到了,附上希望给你一点思路。

public class HeaderIntercepter extends AbstractPhaseInterceptor<SoapMessage>{

public static final String xml_namespaceUR_att = "http://tempuri.org/"

public static final String xml_head_el = "RoadSoapHeader"

public static final String xml_userID_el = "UserID"

public static final String xml_password_el = "PassWord"

public static final String userId = ""

public static final String password= ""

public RoadHeaderIntercepter() {

super(Phase.WRITE)

}

/**

* @param message

* @throws Fault

* @see org.apache.cxf.interceptor.Interceptor#handleMessage(org.apache.cxf.message.Message)

*/

@Override

public void handleMessage(SoapMessage message) throws Fault {

QName qname = new QName(xml_head_el)

Document doc = DOMUtils.createDocument()

Element userIdElement = doc.createElement(xml_userID_el)

userIdElement.setTextContent(userId)

Element passwordElement = doc.createElement(xml_password_el)

passwordElement.setTextContent(password)

Element root = doc.createElementNS(xml_namespaceUR_att, xml_head_el)

root.appendChild(userIdElement)

root.appendChild(passwordElement)

//XMLUtils.printDOM(root)SoapHeader head = new SoapHeader(qname, root)

List<Header>headers = message.getHeaders()

headers.add(head)

}

}

<jaxws:client id="client"

serviceClass="xxx.RoadAskOutServiceSoap"

address="${address}/RoadAskOutService.asmx">

<jaxws:outInterceptors>

<bean class="xxx.HeaderIntercepter"></bean>

</jaxws:outInterceptors>

</jaxws:client>


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11281684.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存