【问题标题】:Access to web method parameters in JAX-WS SOAP handler?访问 JAX-WS SOAP 处理程序中的 Web 方法参数?
【发布时间】:2016-09-01 08:41:44
【问题描述】:

我使用 Java7 和 JAX-WS 开发了一个 SOAP Web 服务。这是界面的摘录:

@WebService(name = "MyWebService",
            targetNamespace = "http://www.something.com")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public interface MyWebServiceInterface
{
   @WebMethod(operationName = "handleMsg",
              action = "handleMsg")
   @Oneway
   void handleMsg(@WebParam(name = "MessageHeader",
                            targetNamespace = "http://www.something.com",
                            header = true,
                            partName = "header") 
                  MessageHeader header,
                  @WebParam(name = "MessageBody",
                            targetNamespace = "http://www.soemthing.com",
                            partName = "body") 
                  MessageType body);
}

我已经为这个 Web 服务实现了一个自定义 SOAP 处理程序(它工作得很好)来做一些额外的事情。在handleFault(..)方法中我需要访问web方法原来的MessageHeader(见上面的接口)。如何做到这一点?

public class MyHandler implements SOAPHandler<SOAPMessageContext>
{
   // ...

   @Override
   public boolean handleFault(final SOAPMessageContext context)
   {
       final Boolean outbound =
          ( Boolean ) context.get( MessageContext.MESSAGE_OUTBOUND_PROPERTY );

       // handle only incoming message which do have a message set
       if ( outbound != null && !outbound.booleanValue() && context.getMessage() != null )
       {
          MessageHeader header = 
             getOriginalHeaderOfFautlyMessage();  // <-- how can this be done?
       }
   }
}

【问题讨论】:

    标签: java web-services soap jax-ws java-7


    【解决方案1】:
    SOAPMessage soapMsg = context.getMessage();
    SOAPEnvelope soapEnv = soapMsg.getSOAPPart().getEnvelope();
    SOAPHeader soapHeader = soapEnv.getHeader();
    

    然后你必须提取你的头节点并解组它。

    【讨论】:

    • 好的,我明白了。然后我可以使用soapHeader.getElementsByTagName( .. ) 来检索单个元素并手动构造MessageHeader。有没有办法加快速度并检索完全生成的对象?不知何故,它已经以另一种方式做到了……
    • @MarkusL 你在使用 CXF 吗?如果是这样,我认为如果您的处理程序在 UNMARSHALL 阶段之后被调用,那么 List parameters = soapMessage.getContent(List.class); 中将有您的 Web 方法参数。见grepcode.com/file/repo1.maven.org/maven2/org.apache.cxf/cxf-api/…和cxf.apache.org/docs/interceptors.html
    • 不,我正在使用带有 JAX-WS 的纯 Java!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    相关资源
    最近更新 更多