2016-09-01 1 views
0

Ich habe einen SOAP-Webservice mit Java7 und JAX-WS entwickelt. Dies ist ein Auszug aus der Schnittstelle:Zugriff auf Webmethodenparameter in JAX-WS SOAP-Handler?

@WebService(name = "MyWebService", 
      targetNamespace = "http://www.something.com") 
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) 
public interface MyWebServiceInterface 
{ 
    @WebMethod(operationName = "handleMsg", 
       action = "handleMsg") 
    @Oneway 
    void handleMsg(@WebParam(name = "MessageHeader", 
          targetNamespace = "http://www.something.com", 
          header = true, 
          partName = "header") 
        MessageHeader header, 
        @WebParam(name = "MessageBody", 
          targetNamespace = "http://www.soemthing.com", 
          partName = "body") 
        MessageType body); 
} 

ich eine benutzerdefinierte SOAP-Handler für diesen Web-Service implementiert haben (es Arbeit ist in Ordnung) einige zusätzliche Dinge zu tun. In der Methode handleFault(..) muss ich auf das Original MessageHeader der Web-Methode zugreifen (siehe Schnittstelle oben). Wie kann das gemacht werden?

public class MyHandler implements SOAPHandler<SOAPMessageContext> 
{ 
    // ... 

    @Override 
    public boolean handleFault(final SOAPMessageContext context) 
    { 
     final Boolean outbound = 
      (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 

     // handle only incoming message which do have a message set 
     if (outbound != null && !outbound.booleanValue() && context.getMessage() != null) 
     { 
      MessageHeader header = 
      getOriginalHeaderOfFautlyMessage(); // <-- how can this be done? 
     } 
    } 
} 

Antwort

1
SOAPMessage soapMsg = context.getMessage(); 
SOAPEnvelope soapEnv = soapMsg.getSOAPPart().getEnvelope(); 
SOAPHeader soapHeader = soapEnv.getHeader(); 

Dann werden Sie Ihren Kopfknoten und entordnen es entpacken.

+0

Ok, ich verstehe. Ich kann dann 'soapHeader.getElementsByTagName (..)' verwenden, um einzelne Elemente abzurufen und den 'MessageHeader' manuell zu konstruieren. Gibt es eine Möglichkeit, das vollständig generierte Objekt zu beschleunigen und abzurufen? Irgendwie macht es das schon anders ... –

+0

@MarkusL Benutzt du CXF? Wenn ja, denke ich, dass, wenn Ihr Handler nach der UNMARSHALL-Phase aufgerufen wird, Ihre Web-Methode params in List parameters = soapMessage.getContent (List.class); siehe http://grepcode.com/file/repo1.maven.org/maven2/org.apache.cxf/cxf-api/2.7.17/org/apache/cxf/interceptor/DocLiteralInInterceptor.java#DocLiteralInInterceptor und http://cxf.apache.org/docs/interceptors.html – MGorgon

+0

Nein, ich verwende reines Java mit JAX-WS! –

Verwandte Themen