我有,将根据其操作被称为运行不同的代码进入的消息自定义SOAP消息处理程序。 我第一次尝试以获取操作名称看起来是liket这样的:
public boolean handleMessage(SOAPMessageContext context)
{
String op = context.get(MessageContext.WSDL_OPERATION);
...
这失败,因为财产MessageContext.WSDL_OPERATION
似乎永远不会被设置。 然后我用这个尝试:
public boolean handleMessage(SOAPMessageContext context)
{
Map<?, ?> headers = (Map<?, ?>)context.get(MessageContext.HTTP_REQUEST_HEADERS);
ArrayList<String> SOAPAction = ((ArrayList<String>) headers.get("SOAPAction"));
String opName = SOAPAction.get(0);
//opName will be formatted like "urn#myOperation", so the prefix must be removed
opName = ((opName.replace("\"","").split("#"))[1]);
这工作,但我担心有可能是在头属性“SOAPAction的”未设置(或者根本不存在)的情况下,还是没有说我期待它的价值。 我也有点担心,因为我不知道这是一个“官方”的方式来获得操作名称-我想通了通过查看的内容context
的调试器。
有没有更好的办法处理传入的SOAP消息时,为了获得操作的名字吗?
你可以调用body.getElementName().getLocalName()
来检索消息有效载荷的SOAP主体元素的名称。 这是一个有点冗长,手册,但它的工作原理。 你可以在你的处理程序如下
if ((boolean) context.get(MessageContext.MESSAGE_INBOUND_PROPERTY){ //for requests only
SOAPEnvelope msg = context.getMessage().getSOAPPart().getEnvelope(); //get the SOAP Message envelope
SOAPBody body = msg.getBody();
String operationName = body.getChildNodes().item(1).getLocalName();
}
上面的代码的结果是保证执行的操作的名称作为您的WSDL指定
编辑:该解决方案仅仅是基于web服务作为执行条件文件/面值包装或RPC /文字
我很末到本方,但我试图做到这一点,在过去一周。 接受答案实际上并没有为每一个JAX-WS实现(至少不是我试过)工作。
我一直努力让自己在独立的地铁这项工作在我的开发环境,但也使用Axis2在真实环境中捆绑的WebSphere 7。
我发现地铁了以下工作:
String operationName = body.getChildNodes().item(0).getLocalName();
和Axis2的以下工作:
String operationName = body.getChildNodes().item(1).getLocalName();
正在发生的事情是,Axis2的插入类型的节点Text
到身体,因为第一个孩子,但地铁没有。 这个文本节点返回一个空本地名称。 我的解决办法是做到以下几点:
NodeList nodes = body.getChildNodes();
// -- Loop over the nodes in the body.
for (int i=0; i<nodes.getLength(); i++) {
Node item = nodes.item(i);
// -- The first node of type SOAPBodyElement will be
// -- what we're after.
if (item instanceof SOAPBodyElement) {
return item.getLocalName();
}
}
正如评论描述我们实际上是在寻找类型的第一个节点SOAPBodyElement
。 希望这将帮助了其他人在未来的看着这一点。
这个SOAPMessageContext包含此信息,并且可以轻松超检索这样的:
public boolean handleMessage(SOAPMessageContext msgContext) {
QName svcn = (QName) smc.get(SOAPMessageContext.WSDL_SERVICE);
QName opn = (QName) smc.get(SOAPMessageContext.WSDL_OPERATION);
System.out.prinln("WSDL Service="+ svcn.getLocalPart());
System.out.prinln("WSDL Operation="+ opn.getLocalPart());
return true;
}
在情况下,如果有人搜索“优雅”的方式获得所需的性能使用
for(Map.Entry e : soapMessageContext.entrySet()){
log.info("entry:"+ e.getKey() + " = " + e.getValue());
}
然后决定你所需要的信息,并得到它!
soapMessageContext.get(YOUR_DESIRED_KEY);