0

Camel ルートを使用して SOAP/JAX-WS 経由で Web サービスを呼び出そうとしていますが、エラーが発生し続けています: CaughtExceptionMessage:HTTP 操作は、http://xyz.com/Service with statusCode: 404 の呼び出しに失敗しました。

Soap UI を使用して同じサービスを呼び出すとファイルが機能するため、リクエストが同じようにマーシャリングされず、サービスがどのメソッドが呼び出されているかを見つけることができず、404 が発生したと推測されます。 Soap UI は次のリクエスト XML を提供します。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"     xmlns:bfg="http://xyz.com/Service">
   <soapenv:Header/>
   <soapenv:Body>
      <bfg:login>
         <bfg:request>
            <ipAddress>1.2.3.4</ipAddress>
            <locationId>0</locationId>
            <password>Foo</password>
            <productId>1</productId>
            <username>Bar</username>
            <vendorSoftwareId>0</vendorSoftwareId>
         </bfg:request>
       </bfg:login>
   </soapenv:Body>
</soapenv:Envelope>

Camel は次の XML を吐き出します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ns2:Envelope xmlns:ns2="http://schemas.xmlsoap.org/soap/envelope/" 
      xmlns:ns3="http://xyz.com/Service" 
      xmlns:ns4="http://xyz.com/Other">    
<ns2:Body>        
    <ns3:login>            
       <ns3:request>                
           <ipAddress>1.2.3.4</ipAddress>                
           <locationId>0</locationId>                
           <password>Foo</password>                
           <productId>0</productId>                
           <username>Bar</username>               
           <vendorSoftwareId>0</vendorSoftwareId>            
       </ns3:request>       
    </ns3:login>    
  </ns2:Body>
</ns2:Envelope> 

違いはかなり小さく、実際には名前空間だけです。XML をコピーして SoapUI に貼り付けてから使用すると、有効な要求/応答が生成されます。

Camel のルートと構成は次のとおりです。

private final SoapJaxbDataFormat globalServiceSoap = 
    new SoapJaxbDataFormat(Service.class.getPackage().getName(),  
     new ServiceInterfaceStrategy(Service.class, true));

from(RouteConstants.LOGIN_SERVICE_END_POINT_URI)
     .routeId("internal::loginGlobalService").marshal(globalServiceSoap)
    .to(endpointUri).unmarshal(globalServiceSoap).process(postLoginProcessor);

マーシャリングされる要求オブジェクトは、その Camel ルートに向かうメッセージの本文です。Camel は 404 で失敗させるリクエストに対して何をしていますか?

どんな助けやアイデアも大歓迎です。

4

1 に答える 1

0

contentTypeCamel がヘッダーまたはヘッダーを追加していないことが判明したSOAPActionため、Web サービスはリクエストを有効な SOAP 呼び出しとして受け入れなかったため、404 をスローしていました (contentType動作させるために重要ではない可能性が最も高い)。Camel と はそのようなものを追加するのに十分賢いと思っていたSoapJaxbDataFormatでしょう (私が見た例ではそうすべきだと示唆しています) が、そうではないようです。

Java コードベースのルート定義を使用すると、不足しているヘッダーを簡単に追加できました。

from(RouteConstants.LOGIN_SERVICE_END_POINT_URI)
    .routeId("internal::loginGlobalService")
    .setHeader(Exchange.CONTENT_TYPE, constant("text/xml"))
    .setHeader("SOAPAction",   constant("login")).marshal(globalServiceSoap)
    .to(endpointUri).unmarshal(globalServiceSoap).process(postLoginProcessor);

結果のリクエストはうまく受け入れられました。XML への要求のマーシャリングは正常に機能し、変更は必要ありませんでした。

于 2013-09-17T01:33:34.787 に答える