You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by onnabble <am...@oracle.com> on 2009/05/19 12:53:53 UTC
Re: SOAPFaultException, weird error in JAX-WS Handlers
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.