由于需要记录访问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>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)