Ошибка 500 Internal Server Error в запросе веб-службы - PullRequest
3 голосов
/ 28 мая 2020

У меня есть существующий jar, который отправляет запрос веб-службы от одного нашего сервера приложений к другому. Ниже приведен код для отправки запроса

 public IUsbMessage executeOutboundRequest(IUsbMessage paramIUsbMessage)
  {
    IUsbMessage localIUsbMessage = UsbMessageFactory.createUbusMessage();
    try
    {
      LogManager.logDebug("ServiceProvider:- Enter executeOutboundRequest");
      Object[] arrayOfObject = (Object[])paramIUsbMessage.getPayload();
      NVPVO localNVPVO = (NVPVO)arrayOfObject[1];
      String str1 = (String)localNVPVO.getHashmap().get("endPointUrl");
      String str2 = (String)localNVPVO.getHashmap().get("respTag");
      String str3 = (String)localNVPVO.getHashmap().get("body");
      str3 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><FIXML xsi:schemaLocation=\"http://www.oracle.com/fixml AcctInq.xsd\" xmlns=\"http://www.oracle.com/fixml\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" + str3.trim();
      LogManager.logDebug("ServiceProvider:- RequestXMLMsg" + str3);
      MessageFactory localMessageFactory = MessageFactory.newInstance();
      SOAPMessage localSOAPMessage1 = localMessageFactory.createMessage();

      SOAPFactory localSOAPFactory = SOAPFactory.newInstance();
      SOAPBody localSOAPBody = localSOAPMessage1.getSOAPBody();
      SOAPElement localSOAPElement1 = localSOAPBody.addChildElement(localSOAPFactory.createName("executeService"));
      SOAPElement localSOAPElement2 = localSOAPElement1.addChildElement(localSOAPFactory.createName("arg_0_0"));
      localSOAPElement2.addTextNode(str3);
      localSOAPMessage1.saveChanges();

      localSOAPMessage1.writeTo(System.out);

      SOAPConnectionFactory localSOAPConnectionFactory = SOAPConnectionFactory.newInstance();
      SOAPConnection localSOAPConnection = localSOAPConnectionFactory.createConnection();

      LogManager.logDebug("ServiceProvider:- endPointUrl" + str1);
      LogManager.logDebug("ServiceProvider:- respTag" + str2);
      URL localURL = new URL(str1);
      SOAPMessage localSOAPMessage2 = localSOAPConnection.call(localSOAPMessage1, localURL);

      DocumentBuilderFactory localDocumentBuilderFactory = DocumentBuilderFactory.newInstance();
      DocumentBuilder localDocumentBuilder = localDocumentBuilderFactory.newDocumentBuilder();
      Document localDocument = localDocumentBuilder.newDocument();

      Element localElement1 = null;
      Element localElement2 = null;
      Text localText = null;
      Element localElement3 = null;

      Iterator localIterator = localSOAPMessage2.getSOAPBody().getChildElements();
      Object localObject2;
      Object localObject3;
      while (localIterator.hasNext())
      {
        localObject1 = (SOAPElement)localIterator.next();
        localElement1 = localDocument.createElement(((SOAPElement)localObject1).getNodeName());
        localObject2 = ((SOAPElement)localObject1).getAttributes();
        Object localObject4;
        if (((NamedNodeMap)localObject2).getLength() > 0) {
          for (int i = 0; i < ((NamedNodeMap)localObject2).getLength(); i++)
          {
            localObject4 = ((NamedNodeMap)localObject2).item(i);
            localElement1.setAttribute(((Node)localObject4).getNodeName(), ((Node)localObject4).getNodeValue());
          }
        }
        localElement3 = localElement1;
        localObject3 = ((SOAPElement)localObject1).getChildElements();
        while (((Iterator)localObject3).hasNext())
        {
          localObject4 = (SOAPElement)((Iterator)localObject3).next();
          localElement1 = localDocument.createElement(((SOAPElement)localObject4).getNodeName());

          NamedNodeMap localNamedNodeMap = ((SOAPElement)localObject1).getAttributes();
          if (localNamedNodeMap.getLength() > 0) {
            for (int j = 0; j < localNamedNodeMap.getLength(); j++)
            {
              Node localNode = localNamedNodeMap.item(j);
              localElement1.setAttribute(localNode.getNodeName(), localNode.getNodeValue());
            }
          }
          localElement2 = localElement1;
          localText = localDocument.createTextNode(((SOAPElement)localObject4).getValue());
          localElement2.appendChild(localText);
          localElement3.appendChild(localElement2);
        }

Данные, которые передаются в файл класса, как показано ниже, содержат запрос XML и другие детали

respTag=AcctInqRs,
body=<Header>
  <RequestHeader>
    <MessageKey>
      <RequestUUID>Req_159538426</RequestUUID>
      <ServiceRequestId>AcctInq</ServiceRequestId>
      <ServiceRequestVersion>10.2</ServiceRequestVersion>
      <ChannelId>OR</ChannelId>
      <LanguageId></LanguageId>
    </MessageKey>
    <RequestMessageInfo>
      <BankId>54</BankId>
      <TimeZone></TimeZone>
      <EntityId></EntityId>
      <EntityType></EntityType>
      <ArmCorrelationId></ArmCorrelationId>
      <MessageDateTime>2020-02-23T14:27:22.627</MessageDateTime> 
     </RequestMessageInfo>
     <Security>
       <Token>
         <PasswordToken>
           <UserId></UserId>
           <Password></Password>
         </PasswordToken>
       </Token>
       <FICertToken></FICertToken>
       <RealUserLoginSessionId></RealUserLoginSessionId>
       <RealUser></RealUser>
       <RealUserPwd></RealUserPwd>
       <SSOTransferToken></SSOTransferToken>
      </Security>
    </RequestHeader>
  </Header>
  <Body>
    <AcctInqRequest>
      <AcctInqRq>
        <AcctId>
          <AcctId>1101614</AcctId>
        </AcctId>
      </AcctInqRq>
    </AcctInqRequest>
  </Body>
</FIXML>,
reqhdr.requestuuid=FINCORE240716215711,
endPointUrl=https://ORPREPROD.domain.com:20322/fiwebservice/FIWebService,
reqhdr.messagedatetime=2020-04-21T21:57:11.000,
reqhdr.servicerequestversion=10.2,
reqhdr.origchannelid=COR,
reqhdr.bankid=54,
reqhdr.servicerequestid=AcctInq

Теперь проблема заключается в том, что запрос отправляется с сервера A на сервер B. Как только запрос достигает сервера B, он выдает ошибку «HTTP / 1.1 500 Internal Server Error», а в журналах отображается следующее xml

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header/>
<env:Body>
<env:Fault xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<faultcode>SOAP-ENV:Client</faultcode>
<faultstring>**Failed to get operation  name from incoming request**</faultstring>
</env:Fault>
</env:Body>
</env:Envelope>

На обоих серверах наше приложение развернуто на Weblogi c, и указанные выше ошибки взяты из логов weblogi c. Может ли кто-нибудь помочь мне определить точную причину этой ошибки, я полностью застрял и не знаю, что делать.

Тот же запрос XML при отправке через SOAP UI работает отлично.

Приведенный ниже запрос XML работает в SOAPUI

<soapenv:Envelope 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:web="http://webservice.fiusb.ci.ibm.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <web:executeService>
         <arg_0_0><![CDATA[<FIXML xsi:schemaLocation="http://www.finacle.com/fixml AcctInq.xsd" xmlns="http://www.finacle.com/fixml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Header><RequestHeader><MessageKey><RequestUUID>Req_158495384262711</RequestUUID><ServiceRequestId>AcctInq</ServiceRequestId><ServiceRequestVersion>10.2</ServiceRequestVersion><ChannelId>COR</ChannelId><LanguageId></LanguageId></MessageKey><RequestMessageInfo><BankId>54</BankId><TimeZone></TimeZone><EntityId></EntityId><EntityType></EntityType><ArmCorrelationId></ArmCorrelationId><MessageDateTime>2020-02-23T14:27:22.627</MessageDateTime></RequestMessageInfo><Security><Token><PasswordToken><UserId></UserId><Password></Password></PasswordToken></Token><FICertToken></FICertToken><RealUserLoginSessionId></RealUserLoginSessionId><RealUser></RealUser><RealUserPwd></RealUserPwd><SSOTransferToken></SSOTransferToken></Security></RequestHeader></Header><Body><AcctInqRequest><AcctInqRq><AcctId><AcctId>1100161916154</AcctId></AcctId></AcctInqRq></AcctInqRequest></Body></FIXML>
]]></arg_0_0>
      </web:executeService>
   </soapenv:Body>
</soapenv:Envelope>

Приведенный ниже XML выдает ту же ошибку «Не удалось получить имя операции из входящего запроса»

<soapenv:Envelope 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:web="http://webservice.fiusb.ci.ibm.com">
   <soapenv:Header/>
   <soapenv:Body>
      <web:executeService>
         <arg_0_0><![CDATA[<FIXML xsi:schemaLocation="http://www.finacle.com/fixml AcctInq.xsd" xmlns="http://www.finacle.com/fixml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Header><RequestHeader><MessageKey><RequestUUID>Req_158495384262711</RequestUUID><ServiceRequestId>AcctInq</ServiceRequestId><ServiceRequestVersion>10.2</ServiceRequestVersion><ChannelId>COR</ChannelId><LanguageId></LanguageId></MessageKey><RequestMessageInfo><BankId>54</BankId><TimeZone></TimeZone><EntityId></EntityId><EntityType></EntityType><ArmCorrelationId></ArmCorrelationId><MessageDateTime>2020-02-23T14:27:22.627</MessageDateTime></RequestMessageInfo><Security><Token><PasswordToken><UserId></UserId><Password></Password></PasswordToken></Token><FICertToken></FICertToken><RealUserLoginSessionId></RealUserLoginSessionId><RealUser></RealUser><RealUserPwd></RealUserPwd><SSOTransferToken></SSOTransferToken></Security></RequestHeader></Header><Body><AcctInqRequest><AcctInqRq><AcctId><AcctId>1100161916154</AcctId></AcctId></AcctInqRq></AcctInqRequest></Body></FIXML>
]]></arg_0_0>
      </web:executeService>
   </soapenv:Body>
</soapenv:Envelope>

Уведомление прямой sla sh (/) в конце пространства имен. Если sla sh отсутствует в пространстве имен, он выдает ошибку в SOAP UI. Пожалуйста, помогите мне понять, как я могу изменить пространство имен в моем java коде

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...