0

Springs 3 を使用しています。Web サービス要求を処理する Endpoint クラスにメソッドがあります。このメソッドは、非同期にするために @Action アノテーションが付けられています。SOAP 要求ヘッダーには、いくつかの情報 (UUID、応答アドレスなど) が含まれています。このメソッド内からこれらのヘッダー情報にアクセスできる必要があります。

Spring WS MessageContext と Apache 軸 MessageContext は空のように見えるため、メソッド内で使用して SOAP ヘッダーを取得することはできません。

4

2 に答える 2

0

このために、アンマーシャリングを使用してヘッダー変数を取得できます。このようなヘッダーがあるとします

<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取得することです。このクラス。このクラスは次のようになります

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である必要があります。同様に 3 つの変数を作成し、

@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 を出力します

于 2015-09-15T05:58:13.500 に答える
0

@Action と Reply Address を使用すると、WS-Addressing パラメータであると想定しています。MessageContext を null にする方法がわかりません。以前に同様の状況にあったことがありました (ただし、Endpoint メソッドから MessageContext にアクセスできませんでした)。

この Web サイトAccess Spring WS MessageContext from whereに記載されている手順に従いました。

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());   
        }
于 2013-09-20T14:06:15.507 に答える