有没有保证的方式在自定义肥皂处理程序来获取操作名称?(Is there a guaranteed w

2019-08-03 03:54发布

我有,将根据其操作被称为运行不同的代码进入的消息自定义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消息时,为了获得操作的名字吗?

Answer 1:

你可以调用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 /文字



Answer 2:

我很末到本方,但我试图做到这一点,在过去一周。 接受答案实际上并没有为每一个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 。 希望这将帮助了其他人在未来的看着这一点。



Answer 3:

这个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;
}


Answer 4:

在情况下,如果有人搜索“优雅”的方式获得所需的性能使用

    for(Map.Entry e : soapMessageContext.entrySet()){
            log.info("entry:"+ e.getKey() + " = " + e.getValue());
    }

然后决定你所需要的信息,并得到它!

soapMessageContext.get(YOUR_DESIRED_KEY);


文章来源: Is there a guaranteed way to get operation name in a custom soap handler?