2009-11-27 3 views
2

J'ai créé une extension de GenericHandler appelée SOAPHeaderHandler. J'ai placé des instructions log4j dans le gestionnaire et je peux voir le constructeur en cours de construction. Lorsque je génère un message SOAP, cependant, je ne vois pas le message lié à la méthode handleRequest. Je me suis inscrit le gestionnaire dans le talon comme suit:JAX-RPC GenericHandler échoue sur Websphere Application Server v6.0.2.35

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 changé le 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> 

Cette est déployé sur Websphere Application Server v6.0.2.35. Des idées quel est le problème? Pourquoi les instructions logger dans le gestionnaire ne sont jamais exécutées? Ai-je échoué à enregistrer le gestionnaire correctement? Dois-je spécifier quelles méthodes de service sont traitées?

+0

J'ai le code pour enregistrer un gestionnaire de client par programme au lieu de par la configuration, mais ne peut pas le rappeler de la mémoire, laissez-moi rechercher très rapidement. –

Répondre

5

J'ai écrit quelques clients SOAP JAX-RPC qui s'exécutent sur WAS 6.0 et requièrent GenericHandlers qui ajoute un en-tête SOAP personnalisé pour demander des messages. J'ai également eu l'obligation de ne pas utiliser un ref-service (pour des raisons de facilité d'utilisation dans le code du client), donc ma classe client configure le gestionnaire d'une manière programmatique. Cela peut ne pas s'appliquer exactement à la façon dont votre configuration fonctionne, 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 l'assistant "Web Service Client" l'utilise également. Il a créé tous les objets métier, sérialiseurs/désérialiseurs, localisateurs et classes de liaison SOAP, etc. J'ai ensuite créé un GenericHandler personnalisé similaire à celui que vous avez.

Comme je ne disposais pas d'une référence de service disponible, je ne pouvais pas le lier au client de cette façon. Donc, je le code suivant dans la classe client lui-même, pour ajouter par programme le gestionnaire:

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 retourné par cette méthode est complètement mis en place, et d'appeler l'une des méthodes de client sur ce travail de classe correctement. La méthode AccountManagerClientHandler.handleRequest (MessageContext msgContext) est appelée, le messageContext est mis à jour, puis le message est envoyé à sa guise.

Questions connexes