【问题标题】:How to parse SOAP headers inside an Endpoint method using Springs如何使用 Springs 在 Endpoint 方法中解析 SOAP 标头
【发布时间】:2013-09-19 05:23:29
【问题描述】:

我正在使用 Springs 3。我在 Endpoint 类中有一个方法来处理 Web 服务请求。该方法使用@Action 进行注释以使其异步。 SOAP 请求标头包含一些信息(如 UUID、回复地址等)。我需要能够从这个方法内部访问这些标头信息。

Spring WS MessageContext 以及 Apache 轴 MessageContext 似乎是空的,所以我无法在方法中使用它来派生 SOAP 标头。

【问题讨论】:

  • 如果您包含一些代码,可能会更容易回答这个问题

标签: spring soap


【解决方案1】:

使用@Action 和回复地址 - 我假设它是 WS-Addressing 参数。 不知道你是如何让 MessageContext 为空的。我之前曾经遇到过类似的情况(但无法从 Endpoint 方法访问 MessageContext )。

我按照本网站Access Spring WS MessageContext from anywhere中提到的步骤进行操作。

一旦检索到 MessageContext(希望不是 null),就可以通过类似这样的方式轻松访问所述参数

SoapMessage sm = (SoapMessage) mc.getRequest();
Iterator<SoapHeaderElement> iter = sm.getEnvelope().getHeader().examineAllHeaderElements();
        while (iter.hasNext()) {
            SoapHeaderElement she = iter.next();
            log.info("\n"+she.getName().getLocalPart()+ " - "+she.getText());   
        }

【讨论】:

    【解决方案2】:

    为此,您可以使用解组来获取标头变量。 假设你有这样的标题

    <soapenv:Header>
      <v2:XHeader>
         <v2:name>xxx</v2:srvcName>
         <v2:version>1.0</v2:srvcVersion>
         <v2:sender>yyy</v2:senderApp>
       </v2:XHeader>
    </soapenv:Header>
    

    你的目标是在你的 web 服务的端点方法中获取值 xxx,1.0,yyy。为此你要做的是,创建一个类说它的名字是 MyHeader.java 以便我们将传入的标头值解组到这个类。这个类看起来像

    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.XmlType;
    
    
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "XHeader", propOrder = {
        "name",
        "version",
        "sender" 
    })
    @XmlRootElement(name = "XHeader")
    public class MyHeader {
    
        @XmlElement(required = true)
        protected String name;
        @XmlElement(required = true)
        protected String version;
        @XmlElement(required = true)
        protected String sender; 
    
    
       public String getName() {
            return name;
        }
       public void setName(String value) {
            this.name = value;
        }
    
         public String getVersion() {
            return version;
        }
       public void setVersion(String value) {
            this.version = value;
        }
     public String getSender() {
            return sender;
        }
       public void setSnder(String value) {
            this.sender = value;
        }
    
    
    }
    

    我所做的是,我们创建了一个 java 类并用

    注释它
    @XmlRootElement(name = "XHeader")
    

    所以我们告诉xml的根元素应该是XHeader。 同样创建了三个变量并用

    注释
    @XmlElement(required = true)
    

    。现在要做的是在端点方法内部,您创建一个 jaxbcontext 对象,如

     JAXBContext jaxbContext = JAXBContext.newInstance(MyHeaderType.class);
        SoapMessage requestMessage = (SoapMessage) messageContext.getRequest();
        SoapHeader reqheader = requestMessage.getSoapHeader();
        Iterator<SoapHeaderElement> itr = reqheader.examineAllHeaderElements();
                while (itr.hasNext()) {
                    SoapHeaderElement ele = itr.next();
    
                    MyHeaderType headerType=(MyHeaderType)jaxbContext.createUnmarshaller().unmarshal(ele.getSource());
                     System.out.println(esbHeaderType.getName());
                     System.out.println(esbHeaderType.getVersion());
                     System.out.println(esbHeaderType.getSender());
                }
    

    .现在它将打印值 xxx,1.0,yyy

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多