Hi,

I see two possible cases here:

a) If you would like to keep the standard SOAP Fault and just customize the 
faultcode, faultstring, details, the following interceptor can be configured in 
out fault chain:
 
public class CustomSoapFaultInterceptor extends 
AbstractPhaseInterceptor<SoapMessage> {
        
        public CustomSoapFaultInterceptor() {
                super(Phase.WRITE);
        }

        @Override
        public void handleMessage(SoapMessage message) throws Fault {
                Exception e = message.getContent(Exception.class);
                if (e instanceof Fault) {
                        Fault fault = (Fault) e;
                        fault.setMessage("This is a critical fault");
                        fault.setFaultCode(new QName("ns", "CriticalFault"));
                        try {
                                DocumentBuilder builder = getBuilder();
                                Document doc = builder.parse(new 
ByteArrayInputStream("<detail><critical>critical 
details</critical></detail>".getBytes()));
                                fault.setDetail(doc.getDocumentElement());
                        } catch (Exception e1) {
                                System.out.println("Cannot build detail 
element: " + e.getMessage());
                        }
                }
        }
...
}

b) If you would like to replace SOAP fault with normal SOAP message, you likely 
should replace the fault with SOAPMessage in message content: 
http://stackoverflow.com/questions/8066474/how-to-transform-soapfault-to-soapmessage-via-interceptor-in-cxf


Regards,
Andrei.

> -----Original Message-----
> From: Przemyslaw Bielicki [mailto:[email protected]]
> Sent: Donnerstag, 12. Dezember 2013 16:50
> To: [email protected]
> Subject: Re: Custom fault response (JAX-WS)
> 
> OK I found a workaround that works but it's very obscure:
> 
> @Override
> public void handleFault(SoapMessage message) {
>   ...
>   Marshaller marshaller =
> JAXBContext.newInstance(MessageHeader.class).createMarshaller();
>   SOAPMessage soap = message.getContent(SOAPMessage.class);
>   soap.getSOAPHeader().removeContents();
>   marshaller.marshal(msgHeader, soap.getSOAPHeader());
>   HttpServletResponse response = (HttpServletResponse)
> message.get(AbstractHTTPDestination.HTTP_RESPONSE);
>   message.setContent(OutputStream.class, response.getOutputStream());
>   Exception e = message.getContent(Exception.class);
>   soap.getSOAPBody().removeContents();
>   marshaller.marshal(OneAXmlUtil.buildErrorList(msgHeader, e),
> soap.getSOAPBody());
>   soap.writeTo(response.getOutputStream());
>   response.getOutputStream().close();
> 
> Is there any "nice" way to do this?
> 
> Cheers,
> Przemyslaw
> 
> 
> 
> --
> View this message in context: http://cxf.547215.n5.nabble.com/Custom-
> fault-response-JAX-WS-tp5737771p5737775.html
> Sent from the cxf-dev mailing list archive at Nabble.com.

Reply via email to