web-services - JAX-RPC GenericHandler 在 Websphere Application Server v6.0.2.35 上失败

标签 web-services handler jax-rpc

我创建了一个名为 SOAPHeaderHandler 的 GenericHandler 扩展。我将 log4j 语句放置在处理程序中,并且可以看到正在构建的构造函数。但是,当我生成 SOAP 消息时,我没有看到与 handleRequest 方法相关的消息。我已在 stub 中注册了处理程序,如下所示:

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 上。有什么想法可能是什么问题吗?为什么处理程序中的记录器语句永远不会被执行?我是否未能正确注册处理程序?我需要指定处理哪些服务方法吗?

最佳答案

我编写了一些在 WAS 6.0 上运行的 JAX-RPC SOAP 客户端,并且需要添加自定义 SOAP header 来请求消息的 GenericHandler。我还要求不使用服务引用(出于客户端代码库中易用性的原因),因此我的客户端类以编程方式设置处理程序。这可能并不完全适用于您的配置的工作方式,但也许有些东西会有用。

我首先使用 Ant 中 RAD 7.5 的 WSDL2Java 工具生成的客户端代码,但“Web 服务客户端”向导也使用它。它创建了所有业务对象、序列化器/反序列化器、定位器和 SOAP 绑定(bind)类等。然后,我创建了一个与您类似的自定义 GenericHandler。

由于我没有可用的服务引用,因此我无法以这种方式将其绑定(bind)到客户端。因此,我在客户端类本身中使用了以下代码,以编程方式添加处理程序:

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,然后以愉快的方式发送消息。

关于web-services - JAX-RPC GenericHandler 在 Websphere Application Server v6.0.2.35 上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1806412/

相关文章:

Java - spring控制台应用程序全局异常处理程序

android - Android 中的锁屏可加快游戏速度

android - 从 Eclipse 迁移到 Android Studio 导致问题,应用程序无法启动

java - 使用 JAX-RPC 时如何将错误请求放入死信队列?

javascript - 通过 Java JAX-RS REST 服务发送带有 JS 的 HTML

java - 没有数据时应该返回哪个http代码

java - 在 Java 中编写和追加大文件的最佳方法是什么

java - 具有 Axis 服务的 JAX-WS 客户端

java - 当 HashMap 作为参数传递时生成 WebService 时出现异常

php - PHP 中的异步 Web 服务