Frage

Ich habe eine Verlängerung der GenericHandler erstellt genannt SOAPHeaderHandler. Ich legte log4j-Anweisungen in der Prozedur und kann sehen, der Konstruktor gebaut. Wenn ich eine SOAP-Nachricht zu generieren, aber ich sehe nicht, die Nachricht an die Methode handelte verwendet. Ich habe den Handler in der Stub registriert wie folgt:

if (service == null) {
    super.service = new com.ibm.ws.webservices.engine.client.Service();
}
else {
    super.service = service;
}
List handlerInfoList = new ArrayList();
QName[] headersArr = null;
HandlerInfo handlerInfo = new HandlerInfo(com.xxxxxx.hdhp.business.debitcard.cardservices.CardServiceSOAPHeaderHandler.class, 
     null, headersArr);
handlerInfoList.add(handlerInfo);
service.getHandlerRegistry().setHandlerChain(new QName("MetavanteDebitCard"), handlerInfoList);

Der Handler ist:

public class AccountManagementSOAPHeaderHandler extends GenericHandler {
 private static Logger logger = Logger.getLogger  (AccountManagementSOAPHeaderHandler.class);
 private HandlerInfo handlerInfo = null;

public AccountManagementSOAPHeaderHandler () {
 logger.info("Constructing AccountManagementSOAPHeaderHandler");
}

 /* (non-Javadoc)
  * @see javax.xml.rpc.handler.GenericHandler#getHeaders()
  */
 public QName[] getHeaders() {
 logger.info("calling getHeaders()");
  return null;
 }

 public boolean handleFault(MessageContext arg0) {
     logger.info("Fault in AccountManagementSOAPHeaderHandler");
  return true;
 }
 public boolean handleResponse(MessageContext arg0) {
   logger.info("Response in AccountManagementSOAPHeaderHandler");
   return true;
 }
 public void init(HandlerInfo arg0) {
  logger.info("init in AccountManagementSOAPHeaderHandler");
  handlerInfo = arg0;
  super.init(arg0);
 }

 public void destroy() {
  logger.info("--- In AccountManagementSOAPHeaderHandler.destroy ()");
 } 

 public boolean handleRequest(MessageContext ctx) {
     logger.debug("BEGIN handleRequest()");
     if (ctx instanceof SOAPMessageContext) {
        SOAPMessageContext context = (SOAPMessageContext) ctx;
        logger.debug("instance of SOAPMessageContext");
        try {
           SOAPHeader header = context.getMessage().getSOAPPart()
                .getEnvelope().getHeader();
           logger.debug("SOAP Header is " + ((header==null)?"NULL":"NOT NULL"));
           Iterator headers = header
                .extractHeaderElements("http://schemas.xmlsoap.org/soap/actor/next");
           while (headers.hasNext()) {
               SOAPHeaderElement he = (SOAPHeaderElement) headers.next();
               logger.info("HEADER Qn " + he.getElementName().getQualifiedName());
           }
       } catch (SOAPException x) {
           logger.error("SOAPException while handlingRequest for SOAP: '" + x.getMessage() + "'");
   }
  }
 return true;
}

und ich habe die web.xml wie folgt geändert:

   <service-ref>
        <description>WSDL Service AccountManagerService</description>
        <service-ref-name>service/AccountManagerService</service-ref-name>
        <service-interface>com.medibank.www.AccountManagerService</service-interface>
<!--        <wsdl-file>WEB-INF/wsdl/AccountManagerService.asmx.wsdl</wsdl-file>-->
        <jaxrpc-mapping-file>WEB-INF/AccountManagerService.asmx_mapping.xml</jaxrpc-mapping-file>
        <service-qname xmlns:pfx="http://www.medibank.com/MBIWebServices/Access/Services/AccountManager/2004/06/">pfx:AccountManagerService</service-qname>
        <port-component-ref>
            <service-endpoint-interface>com.medibank.www.AccountManagerServiceSoap</service-endpoint-interface>
        </port-component-ref>
        <port-component-ref>
            <service-endpoint-interface>com.medibank.www.AccountManagerServiceSoap</service-endpoint-interface>
        </port-component-ref>
        <handler>
         <description>
         </description>
         <display-name></display-name>
         <handler-name>AccountManagementSOAPHeaderHandler</handler-name>
         <handler-class>com.xxxxx.hdhp.business.debitcard.accountmanagement.AccountManagementSOAPHeaderHandler</handler-class>
        </handler>
    </service-ref>

Dies ist auf Websphere Application Server v6.0.2.35 eingesetzt. Irgendwelche Ideen, was das Problem sein könnte? Warum nicht die Logger-Anweisungen in der Prozedur ausgeführt werden? Habe ich es versäumt, die Handler korrekt registrieren? Muss ich festlegen, welche Service-Methoden behandelt werden?

War es hilfreich?

Lösung

Ich schrieb ein paar JAX-RPC SOAP-Clients, die auf 6,0 wurde durchgeführt und erfordern GenericHandlers, die eine benutzerdefinierte SOAP-Header hinzufügen Nachrichten anfordern. Ich hatte auch die Anforderung von keinem Service-ref (für Einfachheit der Verwendung Gründe im Client Code-Basis) verwendet wird, so meine Client-Klasse setzt die Prozedur in einem programmatischen Weg nach oben. Dies kann nicht genau anwenden, wie Ihre Konfiguration funktioniert, aber vielleicht wird etwas von Nutzen sein.

Ich begann mit dem Client-Code generiert von RAD 7.5 des WSDL2Java Werkzeug in Ant, aber die „Web Service Client“ Assistent verwendet es auch. Er schaffte all Business-Objekte, Serializer / Deserializer, Locator und SOAP-Bindung Klassen, etc, etc. Ich habe dann einen benutzerdefinierten GenericHandler ähnlich den Sie haben.

Da ich kein Service-ref verfügten, konnte ich es nicht binden an den Kunden auf diese Weise. So habe ich den folgenden Code in der Client-Klasse selbst, programmatisch den Handler hinzu:

private AccountManager createAccountManagerStub() throws Exception {
    AccountManagerServiceLocator locator = new AccountManagerServiceLocator();

    // Set the JMS endpoint address
    AccountManagerSOAPBindingStub accountManagerStub = (AccountManagerSOAPBindingStub) locator
            .getAccountManagerSOAPPort(new URL(generateJMSEndpointAddress()));

    // Set the Client Handler
    HandlerRegistry registry = locator.getHandlerRegistry();
    List chain = registry
            .getHandlerChain((QName) locator.getPorts().next());
    HandlerInfo handlerInfo = new HandlerInfo();
    handlerInfo.setHandlerClass(AccountManagerClientHandler.class);
    chain.add(handlerInfo);

    return (AccountManager) accountManagerStub;
}

Die Aufgabe wird durch diese Methode zurückgegeben wird komplett eingerichtet, und auf dieser Klasse richtig funktioniert jede der Client-Methoden aufrufen. Der AccountManagerClientHandler.handleRequest (Message msgContext) -Methode aufgerufen wird, die Message aktualisiert, und dann wird die Nachricht auf seiner fröhlichen Art und Weise gesendet werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top