我正在尝试使用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失败的情况下做什么?
非常感谢任何帮助或想法。
答案 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工作正常,不需要更改。