Camel的Marshaling问题,无法正确编组SOAP请求?

时间:2013-09-16 04:15:13

标签: java web-services soap apache-camel

我正在尝试使用Camel路由通过SOAP / JAX-WS调用Web服务,并继续收到错误:CaughtExceptionMessage:HTTP操作无法使用statusCode:404调用http://xyz.com/Service

使用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失败的情况下做什么?

非常感谢任何帮助或想法。

1 个答案:

答案 0 :(得分:0)

事实证明,Camel没有添加contentType标头或SOAPAction标头,因此Web服务正在抛出404,因为它不接受请求作为有效的SOAP调用(大多数可能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工作正常,不需要更改。