You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Davide Gesino <wi...@libero.it> on 2008/02/04 17:01:44 UTC

SOAPFaultException, maybe a bug in the framework?

I am trying to throw a SOAPFaultException from an handler. Anyway I have some
weird error in what I get back.
I have tried the same code on java 6 without CXF and the handler chain works
differently (with java 1.6 works fine)

This is the handleMessage on my custom SOAPHandler (the way I fill the
SOAPFault is taken from the SUN tutorial):

1) WITH JAVA 6:

public boolean handleMessage(SOAPMessageContext ctx) {
		Boolean outboundProperty = (Boolean) ctx
				.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

		if (!outboundProperty) {
			SOAPMessage msg = ctx.getMessage();
			SOAPBody body;
			try {
				body = msg.getSOAPBody();

				SOAPFault fault = body.addFault();
				QName faultName = new QName(SOAPConstants.URI_NS_SOAP_ENVELOPE,
						"Server");
				fault.setFaultCode(faultName);
				fault.setFaultActor("http://gizmos.com/orders");
				fault.setFaultString("Server not responding");

				Detail detail = fault.addDetail();

				QName entryName = new QName("http://gizmos.com/orders/",
						"order", "PO");
				DetailEntry entry = detail.addDetailEntry(entryName);
				entry.addTextNode("Quantity element does not have a value");

				QName entryName2 = new QName("http://gizmos.com/orders/",
						"order", "PO");
				DetailEntry entry2 = detail.addDetailEntry(entryName2);
				entry2.addTextNode("Incomplete address: no zip code");

				throw new SOAPFaultException(fault);

			} catch (SOAPException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return true;
	}


and here is the log of the message sent back to the client. The SOAPFault is
populated correctly.

<soapenv:Fault>
      <faultcode>soapenv:Server</faultcode>
      <faultstring>Server not responding</faultstring>
      <faultactor>http://gizmos.com/orders</faultactor>
      <detail>
        <PO:order xmlns:PO="http://gizmos.com/orders/">Quantity element does
not have a value</PO:order>
        <PO:order xmlns:PO="http://gizmos.com/orders/">Incomplete address:
no zip code</PO:order>
      </detail>
  </soapenv:Fault>

 2) WITH CXF + Java 5:

I have the same handler doing the same work. debugging the SOAPFault seems
to be populated correctly:
Anyway logging the answer here is what I get.


 <soap:Fault>
      <faultcode>soap:Server</faultcode>
      <faultstring>Server not responding</faultstring>
</soap:Fault>

The actor and expecially the details are missing. 
I have tried debugging the org.apache.cxf.jaxws.handler.HandlerChainInvoker,
but I was not abel to figure out if there is some error somewhere.
Do you think it is a bug or an hidden error of mine?

Thanks a lot.

Davide

-- 
View this message in context: http://www.nabble.com/SOAPFaultException%2C-maybe-a-bug-in-the-framework--tp15269025p15269025.html
Sent from the cxf-user mailing list archive at Nabble.com.


Re: SOAPFaultException, weird error in JAX-WS Handlers

Posted by onnabble <am...@oracle.com>.
Hi all,
I am also facing same issue while throwing SOAPFaultException.
Please help me as soon as possible (please please) 
Its very urgent

the response from webservice should be like this
---------------------------------
- <SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <SOAP-ENV:Body>
- <soapenv:Fault xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:x20="http://service.citigroup.com/provider/domainservices/fault/x2005/">
  <faultcode>soapenv:Client</faultcode>
  <faultstring>Validation Exception</faultstring>
  <faultactor>service.GetSoftwareAssetInfoService</faultactor>
- <detail>
  <x20:ErrorCode>DOMAINSERVICES102</x20:ErrorCode>
  <x20:Description>Validation Error: Invalid content was found starting with
element 'x20:RITSIDList'. One of
'{"http://service.citigroup.com/provider/domainservices/profile/x2004/":SOEIDList}'
is expected.</x20:Description>
  </detail>
  </soapenv:Fault>
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>
----------------------------------


----------------------------------
when i test my webservice in SOAPUI, What i got was like this ( here
faultActor & Detail tags are missed)

- <SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <SOAP-ENV:Body>
- <soapenv:Fault xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:x20="http://service.citigroup.com/provider/domainservices/fault/x2005/">
  <faultcode>soapenv:Client</faultcode>
  <faultstring>Validation Exception</faultstring>
  </soapenv:Fault>
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>
------------------------------------

 
My code for the webservice for throwing SOAPfaultException is given
below........

import javax.xml.namespace.QName;
import javax.xml.soap.Detail;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;

import com.citi.soa.common.DomainServicesConstants;
import com.citi.soa.common.DomainServicesErrorCodes;
import com.citigroup.domainservices.common.util.PropertiesReader;

public class TestSoapExp {

	public static javax.xml.ws.soap.SOAPFaultException getException(String
sFaultCode, String sFaultString, String sFaultActor,  String sErrorCode)
	 {
		System.out.println("DomainServicesFaultHandler :: getException(sFaultCode,
sFaultActor, sFaultString, sErrorCode) :: Entry");
        //to resolve the problem of SAAJ
       
System.setProperty("javax.xml.soap.MessageFactory","com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl");
       
System.setProperty("javax.xml.soap.SOAPConnectionFactory","weblogic.wsee.saaj.SOAPConnectionFactoryImpl");
 
        QName faultCode = new
QName("http://schemas.xmlsoap.org/soap/envelope/",sFaultCode);
        javax.xml.soap.SOAPFault fault = null;
        SOAPMessage faultMessage = null;
        try
        {
        	MessageFactory msgFactory = MessageFactory.newInstance();
        	System.out.println("the msgFactory is :: "+msgFactory);
        	faultMessage = msgFactory.createMessage();
            System.out.println("the fault message is :: "+faultMessage);
            SOAPPart part = faultMessage.getSOAPPart();
            System.out.println("the sopa part is :: "+part);
        	SOAPEnvelope envelope = part.getEnvelope();
        	System.out.println("the enevelope is :: "+envelope);
        	SOAPBody body = envelope.getBody();
        	System.out.println("the body is :: "+body);
 
        	System.out.println("Value of fault before fault = body.addFault();
:: " + fault);
        	fault = body.addFault();
        	System.out.println("Value of fault after fault = body.addFault();
:: " + fault);
 
        	System.out.println("before setting value Value of
fault.getFaultCode is :: "+fault.getFaultCode());
        	try{
        		fault.setFaultCode(faultCode);
            }catch(Exception e){
            	System.out.println("Exception while setting faultCode :: " +
e);
            }
            System.out.println("Value of fault.getFaultCode is ::
"+fault.getFaultCode());
            fault.setFaultString(sFaultString);
            System.out.println("Value of fault.getFaultString is ::
"+fault.getFaultString());
            fault.setFaultActor(sFaultActor);
            System.out.println("Value of fault.getFaultActor is ::
"+fault.getFaultActor());
 
            Detail faultDetail = fault.addDetail();
            System.out.println("vaule of faultDeatil :: " + faultDetail);
            SOAPElement e1 = faultDetail.addChildElement("ErrorCode");
            e1.addTextNode(sErrorCode);
            SOAPElement e2 = faultDetail.addChildElement("Description");
            e2.addTextNode(PropertiesReader.getPropertyValue(sErrorCode));
 
            System.out.println("errorcode is e1.getTextContent()" +
e1.getTextContent());
            System.out.println("errorDescr is e2.getTextContent()" +
e2.getTextContent());
 
            System.out.println("befor savechanges FaultMessage Is :: " +
faultMessage);
            faultMessage.saveChanges();
            System.out.println("befor savechanges FaultMessage Is :: " +
faultMessage);
 
            faultMessage.writeTo(System.out);
 
           
System.out.println(faultMessage.getSOAPPart().getEnvelope().getBody().getFault().getFaultActor()+"***********");
 
            System.out.println("value of fault :: " + fault);
            System.out.println("value of body :: " + body);
            System.out.println("value of envelop :: " + envelope);
            System.out.println("value of part :: " + part);
            System.out.println("value of faultMessage :: " + faultMessage);
            System.out.println("value of msgFactory :: " + msgFactory);
 
            System.out.println("value of fault before :: " +
fault.getFaultActor());
            System.out.println("value of fault before :: " +
fault.getFaultString());
            System.out.println("value of fault before  :: " +
fault.getFaultCode());
            String s = faultMessage.getContentDescription();
            System.out.println("Message content :: " + s);
            fault =
faultMessage.getSOAPPart().getEnvelope().getBody().getFault();
            System.out.println("value of fault :: " +
fault.getFaultActor());
            System.out.println("value of fault :: " +
fault.getFaultString());
            System.out.println("value of fault :: " + fault.getFaultCode());
 
        }catch(Exception ex)
        {
        	 System.out.println("DomainServicesFaultHandler ::
getException(sFaultCode, sFaultActor, sFaultString, sErrorCode) = "+ex);
		}
        System.out.println("DomainServicesFaultHandler ::
getException(sFaultCode, sFaultActor, sFaultString, sErrorCode) :: Exit");
 

        return new javax.xml.ws.soap.SOAPFaultException(fault);
	 }
	
	public static void main(String args[])
	{
		System.out.println("entering in to category for throwing
exception.......before throwing..........................");
		try{
			javax.xml.ws.soap.SOAPFaultException retExp = 
getException(DomainServicesConstants.SOAP_FAULT_SERVER,
	                DomainServicesConstants.SYSTEM_EXCEPTION,
	                DomainServicesConstants.PROFILE_PROCESS,
	                DomainServicesErrorCodes.SUPPLIER_MASTER_INVALID_INPUTS);
			System.out.println("returned exp :: " + retExp);
			throw retExp;
	
		}catch(Exception e)
		{
			System.out.println("exception occurred :: " + e);
			System.out.println("exception occurred :: " + e.getMessage());
			System.out.println("exception occurred :: " + e.getCause());
			System.out.println("exception occurred :: " + e.getStackTrace());
	
		}
	}
}


when i run this code as stand alone & it prints proper output.
Please help me.

Thanks a lot in advance.




Davide Gesino wrote:
> 
> I am trying to throw a SOAPFaultException from an handler. Anyway I have
> some weird error in what I get back.
> I have tried the same code on java 6 without CXF and the handler chain
> works differently (with java 1.6 works fine)
> 
> This is the handleMessage on my custom SOAPHandler (the way I fill the
> SOAPFault is taken from the SUN tutorial):
> 
> 1) WITH JAVA 6:
> 
> public boolean handleMessage(SOAPMessageContext ctx) {
> 		Boolean outboundProperty = (Boolean) ctx
> 				.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
> 
> 		if (!outboundProperty) {
> 			SOAPMessage msg = ctx.getMessage();
> 			SOAPBody body;
> 			try {
> 				body = msg.getSOAPBody();
> 
> 				SOAPFault fault = body.addFault();
> 				QName faultName = new QName(SOAPConstants.URI_NS_SOAP_ENVELOPE,
> 						"Server");
> 				fault.setFaultCode(faultName);
> 				fault.setFaultActor("http://gizmos.com/orders");
> 				fault.setFaultString("Server not responding");
> 
> 				Detail detail = fault.addDetail();
> 
> 				QName entryName = new QName("http://gizmos.com/orders/",
> 						"order", "PO");
> 				DetailEntry entry = detail.addDetailEntry(entryName);
> 				entry.addTextNode("Quantity element does not have a value");
> 
> 				QName entryName2 = new QName("http://gizmos.com/orders/",
> 						"order", "PO");
> 				DetailEntry entry2 = detail.addDetailEntry(entryName2);
> 				entry2.addTextNode("Incomplete address: no zip code");
> 
> 				throw new SOAPFaultException(fault);
> 
> 			} catch (SOAPException e) {
> 				// TODO Auto-generated catch block
> 				e.printStackTrace();
> 			}
> 		}
> 
> 		return true;
> 	}
> 
> 
> and here is the log of the message sent back to the client. The SOAPFault
> is populated correctly.
> 
> <soapenv:Fault>
>       <faultcode>soapenv:Server</faultcode>
>       <faultstring>Server not responding</faultstring>
>       <faultactor>http://gizmos.com/orders</faultactor>
>       <detail>
>         <PO:order xmlns:PO="http://gizmos.com/orders/">Quantity element
> does not have a value</PO:order>
>         <PO:order xmlns:PO="http://gizmos.com/orders/">Incomplete address:
> no zip code</PO:order>
>       </detail>
>   </soapenv:Fault>
> 
>  2) WITH CXF + Java 5:
> 
> I have the same handler doing the same work. debugging the SOAPFault seems
> to be populated correctly:
> Anyway logging the answer here is what I get.
> 
> 
>  <soap:Fault>
>       <faultcode>soap:Server</faultcode>
>       <faultstring>Server not responding</faultstring>
> </soap:Fault>
> 
> The actor and expecially the details are missing. 
> 
> Debugging I see a possible symptom in the code (maybe): the toString() of
> the Fault (and of the Details implementation) is:
> 
> [soap:Fault: null]
> [detail:null]
> 
> This is the implementation:
> 
>  /** NON-DOM method for debugging convenience. */
>     public String toString() {
>         return "["+getNodeName()+": "+getNodeValue()+"]";
>     }
> 
> so the node value seems to be null.
> 
> In the SOAP11FaultOutInterceptor I havethe following:
> 
> public void handleMessage(SoapMessage message) throws Fault {
>         message.put(org.apache.cxf.message.Message.RESPONSE_CODE, new
> Integer(500));
> 
>         XMLStreamWriter writer =
> message.getContent(XMLStreamWriter.class);
>         Fault f = (Fault) message.getContent(Exception.class);
> 
>         SoapFault fault = SoapFault.createFault(f, message.getVersion());
> 
> inspecting the 'f' variable I see that the detail member is null.
> Am i missing something of it is a possible bug? 
> Thanks a lot.
> 
> Davide
> 
> 

-- 
View this message in context: http://www.nabble.com/SOAPFaultException%2C-weird-error-in-JAX-WS-Handlers-tp15269025p23613866.html
Sent from the cxf-user mailing list archive at Nabble.com.


Re: SOAPFaultException, maybe a bug in the framework?

Posted by Davide Gesino <wi...@libero.it>.
I have added the bug in the JIRA. From here I cannot access the subversion
repository due to firewall problems... I can try it at home to change toe
code! 

Thanks 

Davide
-- 
View this message in context: http://www.nabble.com/SOAPFaultException%2C-weird-error-in-JAX-WS-Handlers-tp15269025p15306318.html
Sent from the cxf-user mailing list archive at Nabble.com.


Re: SOAPFaultException, maybe a bug in the framework?

Posted by Daniel Kulp <dk...@apache.org>.
This is definitely a bug.    I just traced through it and the 
HandlerChainInvoker doesn't convert the SOAPFaultException to our 
internal SoapFault.   Thus, the rest of the runtime just thinks it's a 
generic exception thing.   

Most likely, in the catch (ProtocolException) thing in 
HandlerChainInvoker, what we need to do is convert it before rethrowing 
it if on the server (not on the client or we'd just have to convert it 
back) if it's a SOAPFaultException.    The code to do the convert is in 
the JAXWSMethodInvoker.    Just need to copy it.  

Can you log a bug in jira with all this so it's tracked?   
https://issues.apache.org/jira/browse/CXF
I may be able to get to it later this week.   That said, feel free to 
copy the code from the method invoker, test it, and send a patch if it 
works.   :-)

Dan


On Monday 04 February 2008, Davide Gesino wrote:
> I am trying to throw a SOAPFaultException from an handler. Anyway I
> have some weird error in what I get back.
> I have tried the same code on java 6 without CXF and the handler chain
> works differently (with java 1.6 works fine)
>
> This is the handleMessage on my custom SOAPHandler (the way I fill the
> SOAPFault is taken from the SUN tutorial):
>
> 1) WITH JAVA 6:
>
> public boolean handleMessage(SOAPMessageContext ctx) {
> 		Boolean outboundProperty = (Boolean) ctx
> 				.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
>
> 		if (!outboundProperty) {
> 			SOAPMessage msg = ctx.getMessage();
> 			SOAPBody body;
> 			try {
> 				body = msg.getSOAPBody();
>
> 				SOAPFault fault = body.addFault();
> 				QName faultName = new QName(SOAPConstants.URI_NS_SOAP_ENVELOPE,
> 						"Server");
> 				fault.setFaultCode(faultName);
> 				fault.setFaultActor("http://gizmos.com/orders");
> 				fault.setFaultString("Server not responding");
>
> 				Detail detail = fault.addDetail();
>
> 				QName entryName = new QName("http://gizmos.com/orders/",
> 						"order", "PO");
> 				DetailEntry entry = detail.addDetailEntry(entryName);
> 				entry.addTextNode("Quantity element does not have a value");
>
> 				QName entryName2 = new QName("http://gizmos.com/orders/",
> 						"order", "PO");
> 				DetailEntry entry2 = detail.addDetailEntry(entryName2);
> 				entry2.addTextNode("Incomplete address: no zip code");
>
> 				throw new SOAPFaultException(fault);
>
> 			} catch (SOAPException e) {
> 				// TODO Auto-generated catch block
> 				e.printStackTrace();
> 			}
> 		}
>
> 		return true;
> 	}
>
>
> and here is the log of the message sent back to the client. The
> SOAPFault is populated correctly.
>
> <soapenv:Fault>
>       <faultcode>soapenv:Server</faultcode>
>       <faultstring>Server not responding</faultstring>
>       <faultactor>http://gizmos.com/orders</faultactor>
>       <detail>
>         <PO:order xmlns:PO="http://gizmos.com/orders/">Quantity
> element does not have a value</PO:order>
>         <PO:order xmlns:PO="http://gizmos.com/orders/">Incomplete
> address: no zip code</PO:order>
>       </detail>
>   </soapenv:Fault>
>
>  2) WITH CXF + Java 5:
>
> I have the same handler doing the same work. debugging the SOAPFault
> seems to be populated correctly:
> Anyway logging the answer here is what I get.
>
>
>  <soap:Fault>
>       <faultcode>soap:Server</faultcode>
>       <faultstring>Server not responding</faultstring>
> </soap:Fault>
>
> The actor and expecially the details are missing.
> I have tried debugging the
> org.apache.cxf.jaxws.handler.HandlerChainInvoker, but I was not abel
> to figure out if there is some error somewhere. Do you think it is a
> bug or an hidden error of mine?
>
> Thanks a lot.
>
> Davide



-- 
J. Daniel Kulp
Principal Engineer, IONA
dkulp@apache.org
http://www.dankulp.com/blog

Re: SOAPFaultException, weird error in JAX-WS Handlers

Posted by Davide Gesino <wi...@libero.it>.
the fact that the node value is null seems not to be the problem, for the
other fields that get printed have that value set to null during SOAPFault
filling. the problem seems to be somewhere else.
-- 
View this message in context: http://www.nabble.com/SOAPFaultException%2C-weird-error-in-JAX-WS-Handlers-tp15269025p15287613.html
Sent from the cxf-user mailing list archive at Nabble.com.