Pergunta

Eu criei uma extensão do GenericHandler chamado SOAPHeaderHandler. Coloquei declarações log4j no manipulador e pode ver o construtor que está sendo construído. Quando eu gerar uma mensagem SOAP, no entanto, não vejo a mensagem relacionada com o método handleRequest. Eu registrado o manipulador no topo da seguinte forma:

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

O Handler é:

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

e eu mudei o web.xml da seguinte forma:

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

Esta é implantado em v6.0.2.35 Websphere Application Server. Todas as idéias que o problema pode ser? Por que as declarações logger no manipulador de nunca ter executado? Eu já não conseguiu registrar o manipulador corretamente? Eu preciso especificar quais métodos de serviço se tratado?

Foi útil?

Solução

Eu escrevi alguns clientes SOAP JAX-RPC que são executados em foi de 6,0, e exigem GenericHandlers que adicionam um cabeçalho SOAP personalizado para mensagens de solicitação. Eu também tive a exigência de não usar um serviço-ref (por razões de facilidade de utilização na base de código do cliente), assim que meus sets classe do cliente até o manipulador de forma programática. Isto pode não exatamente se aplicam a como funciona a sua configuração, mas talvez algo será de uso.

Eu comecei com o código do cliente gerado pela ferramenta WSDL2Java RAD 7.5 de em Ant, mas os "Web Client Service" usos do assistente-lo também. Ele criou todos os objetos de negócios, serializador / deserializadores, localizador e aulas de ligação de SOAP, etc, etc. Eu, então, criou uma GenericHandler costume semelhante ao que você tem.

Desde que eu não tinha um serviço de ref disponível, eu não podia vinculá-lo para o cliente dessa forma. Então eu usei o seguinte código na classe do cliente em si, para adicionar programaticamente o manipulador:

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

O objeto retornado por esse método é completamente configurado, e chamar qualquer um dos métodos de cliente em que o trabalho de classe corretamente. O método AccountManagerClientHandler.handleRequest (MessageContext msgContext) é invocado, os MessageContext atualizado, e, em seguida, a mensagem é enviada em sua maneira alegre.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top