4

こちらがリクエストです

<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そこにあるのですか?

4

5 に答える 5

7

「[userId:null]」は通常、DOM要素の「toString」プリントアウトです。あなたが次のようなことをした場合、おそらく

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

ある種のDOM要素サブクラスであることがわかります。したがって、次のようなものです。

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

テキストノードを印刷する場合があります。

于 2012-04-23T17:33:15.210 に答える
6
    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();
于 2014-01-16T19:39:32.900 に答える
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()); 
    }
于 2013-07-09T15:09:35.380 に答える
1

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

次のようなクラスを作成します

パブリッククラスServerCustomHeaderInterceptorは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());


    }

}

この後、次のようなインターセプターとしてこれを注入する必要があります

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

サーバーコンテキストxmlで。

要件に応じて、数行を変更する必要がある場合があります。基本的なフローはこのように機能します。

于 2013-03-18T13:34:46.313 に答える
1

messageContextMessageContextがある場合、次のコードを使用できます。

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

これにより、すべてのSOAPヘッダーにアクセスできます。

于 2012-04-23T17:15:11.880 に答える