Question

J'ai créé une extension de GenericHandler appelée SOAPHeaderHandler. J'ai placé les instructions log4j dans le gestionnaire et je peux voir le constructeur en construction. Lorsque je génère un message SOAP, cependant, je ne vois pas le message lié à la méthode handleRequest. J'ai enregistré le gestionnaire sur le stub comme suit:

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);

Le gestionnaire est:

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;
}

et j'ai modifié le fichier web.xml comme suit:

   <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>

Ceci est déployé sur Websphere Application Server v6.0.2.35. Des idées ce que le problème peut être? Pourquoi les instructions de consignation dans le gestionnaire ne sont-elles jamais exécutées? Ai-je échoué à enregistrer le gestionnaire correctement? Dois-je spécifier quelles méthodes de service sont gérées?

Était-ce utile?

La solution

J'ai écrit quelques clients SOAP JAX-RPC qui s'exécutent sur WAS 6.0 et nécessitent GenericHandlers qui ajoute un en-tête SOAP personnalisé pour demander des messages. J'avais également l'obligation de ne pas utiliser de service-ref (pour des raisons de facilité d'utilisation dans la base de code du client), de sorte que ma classe de client configure le gestionnaire de manière programmatique. Cela peut ne pas s'appliquer exactement au fonctionnement de votre configuration, mais peut-être que quelque chose sera utile.

J'ai commencé avec le code client généré par l'outil WSDL2Java de RAD 7.5 dans Ant, mais le "client de service Web" " magicien l'utilise aussi. Il a créé tous les objets métier, sérialiseur / désérialiseur, localisateur et classes de liaison SOAP, etc., etc. J'ai ensuite créé un GenericHandler personnalisé similaire à celui que vous avez.

Comme je n'avais pas de service-ref disponible, je ne pouvais pas le lier au client de cette façon. J'ai donc utilisé le code suivant dans la classe client même, pour ajouter le gestionnaire par programme:

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;
}

L'objet renvoyé par cette méthode est complètement configuré et l'appel de l'une des méthodes client de cette classe fonctionne correctement. La méthode AccountManagerClientHandler.handleRequest (MessageContext msgContext) est invoquée, le messageContext est mis à jour, puis le message est envoyé à sa guise.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top