You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by Matt Raible <ma...@raibledesigns.com> on 2014/07/26 00:07:26 UTC

Convert from Fault to Message

Hello,

Is it possible to convert from returning a SOAP Fault to a SOAP Message when using the CXF component? I'm developing a new system to replace one written with IBM Message Broker 6.1. When faults occur with IBM, error messages are returned that looked the following:

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
	<soapenv:Body>
		<NS1:memberServiceRequest xmlns:NS1="http://ws.app.company.com">
			<NS1:return>
				<NS1:errorData>
					<Error>Error goes here</Error>
				</NS1:errorData>
			</NS1:return>
		</NS1:memberServiceRequest>
	</soapenv:Body>
</soapenv:Envelope>

When an error occurs with Apache Camel, a soap fault is sent back to the client:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
	<soap:Body>
		<soap:Fault>
			<soap:Code>
				<soap:Value>soap:Receiver</soap:Value>
			</soap:Code>
			<soap:Reason>
				<soap:Text xml:lang="en">Error goes here</soap:Text>
			</soap:Reason>
		</soap:Fault>
	</soap:Body>
</soap:Envelope>

I believe sending back a fault is better, but I'd also like to make it possible to be backwards compatible, so the old clients don't need to add fault handling. To do this, I need to convert from a fault to a message.

The following Stack Overflow post seems like it might work, but I'm unsure how to add an out interceptor when the only way I'm definining my CXF service is with "cxf:/foo?serviceClass=...".

http://stackoverflow.com/questions/8066474/how-to-transform-soapfault-to-soapmessage-via-interceptor-in-cxf

Thanks,

Matt

Re: Convert from Fault to Message

Posted by Claus Ibsen <cl...@gmail.com>.
Hi

Yeah you can use onException and handled = true, and then do a message
translation where you convert the exception into a soap message.

The caused exception is stored as a property on the exchange with key
http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Exchange.html#EXCEPTION_CAUGHT

See for example Camel in Action page 144 onwards.

On Sat, Jul 26, 2014 at 12:07 AM, Matt Raible <ma...@raibledesigns.com> wrote:
> Hello,
>
> Is it possible to convert from returning a SOAP Fault to a SOAP Message when using the CXF component? I'm developing a new system to replace one written with IBM Message Broker 6.1. When faults occur with IBM, error messages are returned that looked the following:
>
> <?xml version="1.0" encoding="utf-8"?>
> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
>         <soapenv:Body>
>                 <NS1:memberServiceRequest xmlns:NS1="http://ws.app.company.com">
>                         <NS1:return>
>                                 <NS1:errorData>
>                                         <Error>Error goes here</Error>
>                                 </NS1:errorData>
>                         </NS1:return>
>                 </NS1:memberServiceRequest>
>         </soapenv:Body>
> </soapenv:Envelope>
>
> When an error occurs with Apache Camel, a soap fault is sent back to the client:
>
> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
>         <soap:Body>
>                 <soap:Fault>
>                         <soap:Code>
>                                 <soap:Value>soap:Receiver</soap:Value>
>                         </soap:Code>
>                         <soap:Reason>
>                                 <soap:Text xml:lang="en">Error goes here</soap:Text>
>                         </soap:Reason>
>                 </soap:Fault>
>         </soap:Body>
> </soap:Envelope>
>
> I believe sending back a fault is better, but I'd also like to make it possible to be backwards compatible, so the old clients don't need to add fault handling. To do this, I need to convert from a fault to a message.
>
> The following Stack Overflow post seems like it might work, but I'm unsure how to add an out interceptor when the only way I'm definining my CXF service is with "cxf:/foo?serviceClass=...".
>
> http://stackoverflow.com/questions/8066474/how-to-transform-soapfault-to-soapmessage-via-interceptor-in-cxf
>
> Thanks,
>
> Matt



-- 
Claus Ibsen
-----------------
Red Hat, Inc.
Email: cibsen@redhat.com
Twitter: davsclaus
Blog: http://davsclaus.com
Author of Camel in Action: http://www.manning.com/ibsen
hawtio: http://hawt.io/
fabric8: http://fabric8.io/