2012-04-23 3 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?

ответ

5

«[userId: null]», как правило, является печатью «toString» элемента DOM. Скорее всего, если вы сделаете что-то вроде

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

вы увидите, что это подкласс класса DOM somesort. Таким образом, что-то вроде:

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

может печатать текстовый узел.

+1

Это работает. Спасибо ... – user219882

1

Имея MessageContext MessageContext, вы можете использовать этот код:

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

, который дает вам доступ ко всем заголовкам SOAP.

+2

Как я вижу, 'HeaderList' и 'JAXWSProperties' - это классы в пакете' com.sun.xml.internal.ws. * '. Я действительно не хочу использовать это ... – user219882

1

Мы можем получить заголовок SOAP на стороне сервера, добавив следующий код в перехватчик CXF.

Создать класс как

общественный класс 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.

Возможно, нам потребуется изменить несколько строк в соответствии с вашими требованиями. Основной поток будет работать следующим образом.

2

Вы можете получить заголовки мыла без перехватчиков и без JAXB.

В классе 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 Часто задаваемые вопросы: http://cxf.apache.org/faq.html#FAQ-HowcanIaddsoapheaderstotherequest/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

Dunno, насколько эффективен и надежный этот фрагмент кода, но хорошо работает для меня;) –

+0

Я нашел этот ответ полезным, потому что он (правильно) показывает, как извлечь информацию из заголовка SOAP. –

+0

'SOAPPart part = request.getSOAPPart();' эта часть дает мне ошибку, так как она не может идентифицировать запрос. –