Hi, I tried setting the Soap Fault in exchange.setException() but that also is not working. Still getting the soap envelope with empty body.
Just wondering if you are using camel 2.0.0 too, coz then I can be sure this issue is not due to the specific version. Thanks, Himanshu Jim Talbut wrote: > > Hi, > I'm no expert on this, but have you tried setting it as an exception > instead? > This is working for me: > public class SoapFaultConversionProcessor implements Processor > { > private static final String ANONYMOUS_FAULT_STRING = "An unexpected > error has occured."; > private static final Logger log = LoggerFactory.getLogger( > SoapFaultConversionProcessor.class ); > > private void processException( Exchange exchange, Exception ex, > boolean rethrow ) throws Exception > { > if( ex instanceof SoapFault ) > { > SoapFault soapFault = (SoapFault)ex; > if( "client".equalsIgnoreCase( > soapFault.getFaultCode().getLocalPart() ) ) > { > log.debug( "Ignoring original client soap:fault." ); > if( rethrow ) > { > throw ex ; > } > else > { > return ; > } > } > } > String faultMessage = ANONYMOUS_FAULT_STRING ; > SoapFault fault = new SoapFault( faultMessage, > SoapFault.FAULT_CODE_SERVER ); > Element detail = fault.getOrCreateDetail(); > Document doc = detail.getOwnerDocument(); > Element corrId = doc.createElement( "CorrelationId" ); > corrId.setTextContent( exchange.getExchangeId() ); > > detail.appendChild( corrId ); > if( rethrow ) > { > log.debug( "Throwing new soap:fault." ); > exchange.setProperty( Exchange.EXCEPTION_CAUGHT, fault); > } > else > { > log.debug( "Setting new soap:fault." ); > exchange.setException( fault ); > } > } > > @Override > public void process( Exchange exchange ) throws Exception > { > log.debug( "Checking caught exception" ); > Exception caused = exchange.getProperty( > Exchange.EXCEPTION_CAUGHT, Exception.class ); > if( null != caused ) > { > log.warn( "Exception caught" ); > log.warn( caused.toString() ); > processException( exchange, caused, true ); > } > > log.debug( "Checking contained exception" ); > Exception ex = exchange.getException(); > if( null != ex ) > { > log.warn( "Exception found in exchange" ); > log.warn( ex.toString() ); > processException( exchange, ex, false ); > } > } > > @Override > public String toString() > { > return this.getClass().getName(); > } > > } > > with: > from( sourceEndpoint ) > .onException( Throwable.class ).processRef( > "cxfSoapFaultConversionProcessor" ).end() > .loadBalance().roundRobin().to( > destinationEndpoints ); > ; > > Jim > > > On 24/03/2010 07:30, HiS wrote: >> Hi Willem, >> >> Thanks for your response. >> I am having the following groovy route: >> >> from("http:requestset") >> .onException(Exception.class) >> .handled(true) >> .processRef('ErrorProcessor').end() >> .process(new ValidateRequestProcessor()); >> >> Here the 'ValidateRequestProcessor' validates the request and on finding >> missing parameter throws an exception. The exception is caught by the >> 'ErrorProcessor' where the code for returning soap fault is written. >> >> We are using PAYLOAD DataFormat for camel-cxf but could not migrate to >> Camel >> 2.3.0 due to other dependencies. >> >> Is there any workaround to the issue which can be used to return the soap >> fault (I saw examples of using setFaultBody in the route but that also >> did >> not seem to work) ? >> >> Thanks, >> Himanshu >> >> >> willem.jiang wrote: >> >>> Hi, >>> >>> Can I have a look at your Camel route? >>> And which camel-cxf DataFormat are you using ? >>> If you are using PAYLOAD DataFormat, I'm afraid you need to use Latest >>> Camel 2.3.0 SNAPSHOT. As William Tam just added a enhancement for it[1] >>> >>> [1]https://issues.apache.org/activemq/browse/CAMEL-2495 >>> >>> HiS wrote: >>> >>>> Hi All, >>>> >>>> We are using CXF 2.2.3 with Camel 2.0.0 for exposing an end-point on >>>> Tomcat >>>> 6.0. A requirement is that if incoming request does not have a >>>> parameter, >>>> soap fault needs to be thrown. >>>> >>>> As the Fault and Out Consolidation has happened in Camel 2.0.0, I am >>>> creating a soap fault and setting it in the Out stream of Exchange >>>> inside >>>> a >>>> processor. >>>> >>>> SOAPMessage msg = null; >>>> try { >>>> MessageFactory factory = >>>> MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL); >>>> msg = factory.createMessage(); >>>> SOAPBody body = msg.getSOAPBody(); >>>> QName qName = SOAPConstants.SOAP_SENDER_FAULT; >>>> >>>> SOAPFault soapFault = body.addFault(qName, "Test >>>> Code"); >>>> Detail detail = soapFault.addDetail(); >>>> detail.setValue("Test Description"); >>>> >>>> exchange.getOut().setFault(true); >>>> >>>> exchange.getOut().setHeader(org.apache.cxf.message.Message.RESPONSE_CODE, >>>> new Integer(500)); >>>> exchange.getOut().setBody(body); >>>> >>>> } catch (SOAPException e) { >>>> e.printStackTrace(); >>>> } >>>> >>>> After doing this, I am not getting any exception but the soap fault is >>>> also >>>> not getting thrown, instead a Soap Envelope with empty Body is coming >>>> as >>>> output. >>>> >>>> Any ideas on what could be going wrong in the above? >>>> >>>> Thanks, >>>> Himanshu >>>> >>> >>> >>> >> > > > -- View this message in context: http://old.nabble.com/Unable-to-throw-Soap-Fault-tp28010828p28012211.html Sent from the Camel - Users mailing list archive at Nabble.com.