2009-11-27 3 views
2

SOAPHeaderHandler라는 GenericHandler Extension을 생성했습니다. 나는 log4j 문을 핸들러에 넣었고 생성자가 생성되는 것을 볼 수있었습니다. 그러나 SOAP 메시지를 생성 할 때 handleRequest 메서드와 관련된 메시지가 표시되지 않습니다.Websphere Application Server v6.0.2.35에서 JAX-RPC GenericHandler가 실패합니다.

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

핸들러는 다음과 같습니다 : 다음과 같이 나는 스텁에 핸들러를 등록했습니다

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

다음과 같이 나는 web.xml을 변경했습니다 :

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

이를 Websphere Application Server v6.0.2.35에 전개됩니다. 어떤 아이디어가 문제 일 수 있습니까? 핸들러의 로거 명령문이 실행되지 않는 이유는 무엇입니까? 처리기를 올바르게 등록하지 못 했습니까? 처리 할 서비스 메소드를 지정해야합니까?

+0

나는 클라이언트 핸들러를 등록 프로그램 대신 구성으로하는 코드를 가지고 있지만, 내가 진짜 빨리 그것을 살펴 보자, 메모리에서 불러올 수 없습니다. –

답변

5

WAS 6.0에서 실행되는 몇 가지 JAX-RPC SOAP 클라이언트를 작성했으며 메시지를 요청하기 위해 사용자 정의 SOAP 헤더를 추가하는 GenericHandlers가 필요합니다. 또한 service-ref (클라이언트 코드베이스에서 사용하기 쉬운 이유로)를 사용하지 않아도되므로 클라이언트 클래스가 프로그래밍 방식으로 핸들러를 설정합니다. 이는 구성이 작동하는 방식에 정확히 적용되지 않을 수도 있지만, 아마도 무언가가 사용될 것입니다.

Ant에서 RAD 7.5의 WSDL2Java 도구로 생성 된 클라이언트 코드로 시작했지만 "웹 서비스 클라이언트"마법사도이를 사용합니다. 그것은 모든 비즈니스 개체, serializer/deserializers, 로케이터 및 SOAP 바인딩 클래스 등을 만들었습니다. 그런 다음 사용자 정의 GenericHandler를 비슷한 스타일로 만듭니다.

사용 가능한 service-ref가 없었기 때문에 클라이언트에 바인딩 할 수 없었습니다. 완전히 설정하고, 제대로 클래스 작업에 클라이언트 방법 중 하나를 호출되는 메소드에 의해 반환

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

목적 : 그래서 프로그래밍 처리기를 추가, 클라이언트 클래스 자체에 다음 코드를 사용했다. AccountManagerClientHandler.handleRequest (MessageContext msgContext) 메서드가 호출되고 messageContext가 업데이트 된 다음 메시지가 메리 방식으로 전송됩니다.