فشل JAX-RPC GenericHandler على v6.0.2.35 خادم بنك الإسكان للتجارة تطبيق

StackOverflow https://stackoverflow.com/questions/1806412

  •  05-07-2019
  •  | 
  •  

سؤال

ولقد خلقت تمديد GenericHandler دعا SOAPHeaderHandler. أنا وضعت البيانات log4j في معالج ويمكن أن نرى منشئ يجري بناؤها. عندما إنشاء رسالة SOAP، ومع ذلك، وأنا لا أرى الرسالة تتعلق طريقة handleRequest. لقد سجلت معالج في كعب كما يلي:

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>

ويتم نشر ذلك على v6.0.2.35 خادم بنك الإسكان للتجارة تطبيق. أي أفكار ما قد تكون المشكلة؟ لماذا البيانات مسجل في معالج أبدا الحصول على تنفيذها؟ وأنا فشلت في تسجيل معالج بشكل صحيح؟ هل أنا بحاجة إلى تحديد أي أساليب خدمة الحصول على التعامل معها؟

هل كانت مفيدة؟

المحلول

وكتبت عدد قليل من العملاء SOAP JAX-RPC التي تعمل على WAS 6.0، وتتطلب GenericHandlers أن إضافة رأس SOAP مخصصة لطلب الرسائل. كما أتيحت لي شرط عدم استخدام خدمة المرجع (لسهولة الاستخدام الأسباب في مصدر برنامج العميل)، لذلك صفي العميل يضع المعالج بطريقة برمجية. قد يتم تطبيق هذا بالضبط كيف يعمل التكوين الخاص بك، ولكن ربما شيء سوف تكون ذات فائدة.

ولقد بدأت مع رمز العميل الناتجة عن RAD 7.5 من أداة WSDL2Java في النملة، ولكن "العميل خدمة ويب" يستخدم المعالج أنها كذلك. أنه خلق كل الكائنات الأعمال، مسلسل / deserializers، لتحديد المواقع وSOAP الطبقات ملزمة، الخ، الخ. ثم خلق العرف GenericHandler مماثلة لتلك التي لديك.

وبما أنني لم يكن لديك خدمة المرجع المتاحة، لم أتمكن من ربط إلى العميل بهذه الطريقة. لذلك تستخدم التعليمة البرمجية التالية في فئة العميل نفسه، إضافة إلى معالج برمجيا:

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

ويتم تعيين الكائن إرجاعها بواسطة هذه الطريقة تماما حتى، واستدعاء أي من الأساليب العميل على أن العمل الطبقة بشكل صحيح. يتم استدعاء (MessageContext msgContext) طريقة AccountManagerClientHandler.handleRequest، وmessageContext المحدثة، ومن ثم يتم إرسال الرسالة في طريقها مرح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top