2012-04-23 17 views
2

は、ここで要求取得する方法SOAPヘッダ

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:soap="http://soap.ws.server.wst.fit.cvut.cz/"> 
    <soapenv:Header> 
     <userId>someId</userId> 
    </soapenv:Header> 
    <soapenv:Body> 
    ... 
    </soapenv:Body> 
</soapenv:Envelope> 

であり、私はそのuserIdを取得したいです。

私はこの

private List<Header> getHeaders() { 
    MessageContext messageContext = context.getMessageContext(); 
    if (messageContext == null || !(messageContext instanceof WrappedMessageContext)) { 
     return null; 
    } 
    Message message = ((WrappedMessageContext) messageContext).getWrappedMessage(); 
    return CastUtils.cast((List<?>) message.get(Header.HEADER_LIST)); 
} 

private String getHeader(String name) { 
    List<Header> headers = getHeaders(); 
    if (headers != null) { 
     for (Header header : headers) { 
      logger.debug(header.getObject()); 
      // return header by the given name     
     } 
    } 
    return null; 
} 

を試してみましたが、それは[userId : null]をログに記録します。どのようにして価値を得ることができますか?nullはそこにありますか?

HeaderList hl = (HeaderList) messageContext.get(JAXWSProperties.INBOUND_HEADER_LIST_PROPERTY); 

あなたはすべてのSOAPヘッダへのアクセスを提供します:

答えて

5

"[userId:null]"は、一般的にDOM要素の "toString"プリントアウトです。ほとんどの場合、あなたが

logger.debug(header.getObject().getClass()) 

ような何かを行う場合は、それはsomesortのDOM要素のサブクラスであることがわかります。したがって、次のようなものがあります。

logger.debug(((Element)header.getObject()).getTextContent()) 

テキストノードが印刷されることがあります。

+1

それは動作します。ありがとうございました... – user219882

1

MessageContextのMessageContextを持って、あなたはこのコードを使用することができます。

+2

を、私はそれを見ると、 'HeaderList'と'JAXWSProperties'は' com.sun.xml.internal.ws。* 'パッケージのクラスです。私は本当にこれを使用したくない... – user219882

1

CXFインターセプタに次のコードを追加することで、サーバー側でSOAPヘッダーを取得できます。

は、クラスを作成します

などのパブリッククラスServerCustomHeaderInterceptorは、この後、私たちはあなたのサーバーのコンテキストXMLで

<jaxws:inInterceptors> 
     <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" /> 
    <bean class="org.example.hellows.soap12.ServerCustomHeaderInterceptor" /> 
    </jaxws:inInterceptors> 

などのインターセプタとしてこれを注入する必要があるAbstractSoapInterceptor {

@Resource 
private WebServiceContext context; 

public ServerCustomHeaderInterceptor() { 
    super(Phase.INVOKE); 

} 

@Override 
public void handleMessage(SoapMessage message) throws Fault,JAXBException { 
    System.out.println("ServerCustomHeaderInterceptor handleMessage"); 
    JAXBContext jc=null; 
    Unmarshaller unmarshaller=null; 
    try { 
    jc = JAXBContext.newInstance("org.example.hello_ws"); 
    unmarshaller = jc.createUnmarshaller(); 
    } catch (JAXBException e) { 
    e.printStackTrace(); 
    } 


    List<Header> list = message.getHeaders(); 
    for (Header header : list) { 
      ElementNSImpl el = (ElementNSImpl) header.getObject(); 
     ParentNode pn= (ParentNode) el.getFirstChild(); 
     //Node n1= (Node) pn; 
     //Node n1= (Node) el.getFirstChild(); 

     CustomHeader customHeader=(CustomHeader) unmarshaller.unmarshal(el.getFirstChild()); 


    } 

} 

を拡張します。

要件に応じて数行を変更する必要がある場合があります。基本的な流れはこのように動作します。

2

インターセプタなしでJAXBなしでSOAPヘッダーを取得できます。あなたのservice_implクラスの追加

public class YourFunctionNameImpl implements YourFunctionName{ 

@Resource 
private WebServiceContext context; 

private List<Header> getHeaders() { 
    MessageContext messageContext = context.getMessageContext(); 
    if (messageContext == null || !(messageContext instanceof WrappedMessageContext)) { 
     return null; 
    } 

    Message message = ((WrappedMessageContext) messageContext).getWrappedMessage(); 
    List<Header> headers = CastUtils.cast((List<?>) message.get(Header.HEADER_LIST)); 
    return headers; 
} 

...

次に、あなたの関数内で使用することができます:

List<Header> headers = getHeaders(); 
     for(Iterator<Header> i = headers.iterator(); i.hasNext();) { 
      Header h = i.next(); 
      Element n = (Element)h.getObject(); 

      System.out.println("header name="+n.getLocalName()); 
      System.out.println("header content="+n.getTextContent()); 
    } 
+1

このメソッドは、サービスレイヤーからSOAPヘッダーにアクセスする方が便利でした。 CXFよくある質問(FAQ): http://cxf.apache.org/faq.html#FAQ-HancanIaddsoapheaderstotherequestquest /response? – burcakulug

5
import javax.xml.soap.*; 

    SOAPPart part = request.getSOAPPart(); 
    SOAPEnvelope env = part.getEnvelope(); 
    SOAPHeader header = env.getHeader(); 
    if (header == null) { 
     // Throw an exception 
    } 

    NodeList userIdNode = header.getElementsByTagNameNS("*", "userId"); 
    String userId = userIdNode.item(0).getChildNodes().item(0).getNodeValue(); 
+0

このコードスニペットはどれくらい効率的で信頼性が高いのですか?) –

+0

SOAPヘッダーから物を抽出する方法を(正しく)示しています。 –

+0

'SOAPPart part = request.getSOAPPart();'この部分はリクエストを識別できないため、エラーが表示されます。 –

関連する問題