Hi
Thanks for the replies.
When I expose the following class as a Web Service, using CXF, I can
correctly retrieve the rating using the getRating method call from a soap
client:
@WebService(serviceName = "TraderHistory", portName = "TraderHistoryPort")
@WebServiceProvider()
@ServiceMode(Service.Mode.MESSAGE)
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use =
SOAPBinding.Use.LITERAL)
public class TraderHistoryHandler implements ITraderHistory {
private EntityManagerFactory entityManagerFactory;
@WebMethod(exclude = true)
public void setEntityManagerFactory(EntityManagerFactory
entityManagerFactory) {
this.entityManagerFactory = entityManagerFactory;
}
@WebMethod(operationName = "getRating", action = "urn:GetRating")
@WebResult(name = "rating")
public float getTraderRating(String traderName, Integer scoreType) {
...
}
However, when I try to route the cxf service to a spring bean to do the
required processing (instead of in the implemented method itself):
from("cxf:bean:soapEndpoint")
.to("bean:messageProcessor?methodName=processMessage");
Camel do intercept the call and the processMessage method is invoked:
public SOAPMessage processMessage(Exchange exchange) {
System.out.println("PROCESSING MESSAGE...");
try {
String param1 = (String) exchange.getIn().getBody(List.class).get(0);
Integer param2 = (Integer)
exchange.getIn().getBody(List.class).get(1);
System.out.println("param1 = " + param1);
System.out.println("param2 = " + param2);
try {
return
createSoapMessage(traderHistoryHandler.getTraderRating(param1, param2));
}
catch (Exception e) {
System.out.println("ERROR2");
e.printStackTrace();
SOAPMessage msg = createSoapMessage((float) -1);
exchange.getOut().setBody(msg, SOAPMessage.class);
return msg;
}
}
catch (Exception e) {
System.out.println("ERROR1");
e.printStackTrace();
}
return null;
}
public static SOAPMessage createSoapMessage(Float value) {
try {
SOAPMessage soapMessage =
MessageFactory.newInstance().createMessage();
SOAPEnvelope envelope = soapMessage.getSOAPPart().getEnvelope();
envelope.addNamespaceDeclaration("ns1", "http://poc.tatis.com/");
envelope.addNamespaceDeclaration("wsdl",
"http://schemas.xmlsoap.org/wsdl/");
envelope.addNamespaceDeclaration("xsd",
"http://www.w3.org/2001/XMLSchema");
envelope.addNamespaceDeclaration("xsi",
"http://www.w3.org/2001/XMLSchema-instance");
envelope.addNamespaceDeclaration("soap",
"http://schemas.xmlsoap.org/soap/envelope/");
envelope.setEncodingStyle("http://schemas.xmlsoap.org/soap/encoding/");
SOAPBody body = soapMessage.getSOAPPart().getEnvelope().getBody();
QName payloadName = new QName("http://poc.tatis.com/", "rating",
"ns1");
SOAPBodyElement payload = body.addBodyElement(payloadName);
payload.addTextNode(String.valueOf(value)).setAttribute("xsi:type",
"xsd:float");
soapMessage.writeTo(System.out);
System.out.println();
return soapMessage;
}
catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
But, the soap message (as shown in the previous mail) is not routed through
to the client. No exceptions are thrown in the process.
If I strictly follows the example and implement a Provider<SOAPMessage> :
public SOAPMessage invoke(SOAPMessage soapMessage) {
throw new UnsupportedOperationException("Placeholder method");
}
then the client receives the correct message and all is well.
Regards
Ian
willem.jiang wrote:
>
> Hi ,
>
> Do you use the SAAJ to build up the SOAP message ?
> Maybe you need to show us the codes or a small test case to let us
> reproduce the error.
>
> Willem
>
> Ian de Beer wrote:
>> Hi
>> I have created a camel route similar to the cxf provider example. The
>> exchange is correctly routed to a bean that creates a SOAP message .
>> Before
>> I return the message I display it and I can verify that it contains the
>> correct response. However when the response message arrives back at the
>> SOAP
>> client the content of the SOAP message body has mysteriously disappeared.
>> I
>> also notice that the namespaces has changed from what I have set them to.
>> What I send:
>> <SOAP-ENV:Envelope
>> xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
>> xmlns:ns1="http://poc.tatis.com/"
>> xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
>> xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
>> xmlns:xsd="http://www.w3.org/2001/XMLSchema"
>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>> SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Header/><SOAP-ENV:Body><ns1:getRatingResponse><rating
>> xsi:type="xsd:float">123.11</rating></ns1:getRatingResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
>>
>> What I receive:
>> <soap:Envelope
>> xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:getRatingResponse
>> xmlns:ns1="http://poc.tatis.com/"/></soap:Body></soap:Envelope>
>>
>> Can someone perhaps shed some light on this behaviour.
>> Regards
>> Ian
>>
>
>
>
--
View this message in context:
http://www.nabble.com/Camel-cxf-route-interception-and-SOAP-messages-tp16399115s22882p16417198.html
Sent from the Camel - Users mailing list archive at Nabble.com.