Yes, Axis2 injects the detail into the AxisFault there, but I had to add that
detail via setFaultMessage() in TestServiceSkeleton before throwing the fault.
Skeleton:
EmployeeNotFoundException e =
new EmployeeNotFoundException("Could not find employee: " +
getEmployeeIdRequest.getFullname());
EmployeeNotFoundFault msg = new EmployeeNotFoundFault();
msg.setRetryable(false);
msg.setSeverity("Fatal");
e.setFaultMessage(msg);
throw e;
MessageReceiver
} catch (EmployeeNotFoundException e) {
msgContext.setProperty(org.apache.axis2.Constants.FAULT_NAME,
"EmployeeNotFoundFault");
org.apache.axis2.AxisFault f = createAxisFault(e);
if (e.getFaultMessage() != null) {
f.setDetail(toOM(e.getFaultMessage(), false));
}
throw f;
}
private org.apache.axis2.AxisFault createAxisFault(java.lang.Exception e) {
org.apache.axis2.AxisFault f;
Throwable cause = e.getCause();
if (cause != null) {
f = new org.apache.axis2.AxisFault(e.getMessage(), cause);
} else {
f = new org.apache.axis2.AxisFault(e.getMessage());
}
return f;
}
private org.apache.axiom.om.OMElement toOM(
com.mathworks.bat.webservices.test.EmployeeNotFoundFault param,
boolean optimizeContent) throws org.apache.axis2.AxisFault {
try {
return param
.getOMElement(
com.mathworks.bat.webservices.test.EmployeeNotFoundFault.MY_QNAME,
org.apache.axiom.om.OMAbstractFactory
.getOMFactory());
} catch (org.apache.axis2.databinding.ADBException e) {
throw org.apache.axis2.AxisFault.makeFault(e);
}
}
EmployeeNotFoundFault.getOMElement() which is where things get set up for an
eventual call to serialize(). serialize() is where all the nitty-gritty
happens.
-Eric
From: Manuel Darveau [mailto:[EMAIL PROTECTED]
Sent: Tuesday, November 18, 2008 12:31 PM
To: [email protected]
Subject: Re: AXIS2-3239, 3443
Thanks Eric.
I check the code generated usin wsdl2java -ss -uri TestService.wsdl.
The catch(EmployeeNotFoundException) in
TestServiceMessageReceiverInOut.invokeBusinessLogic does the job of injecting
the detail in the axis fault.
This is done in a somewhat complicated way and it depends on generated
constants in EmployeeNotFoundException.
When you use the bottom up approach, the Exception (in this case
EmployeeNotFoundException) will not be filled with axis stuff so it is not that
easy to convert it back to XML.
I guess I will have to did again in axis code to see how an Object is converted
into XML and simply convert my exception and put the result (which should be a
OMElement) in the detail of the AxisFault.
Any axis dev has advice on how to convert my exception into a OMElement?
Manuel
On Tue, Nov 18, 2008 at 11:33 AM, Eric Decosta <[EMAIL PROTECTED]<mailto:[EMAIL
PROTECTED]>> wrote:
I went a different route and tried doing things top-down from the WSDL (see
attached) and things worked as expected:
Request:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:test="http://test.webservices.bat.mathworks.com">
<soapenv:Header/>
<soapenv:Body>
<test:getEmployeeIdRequest>
<test:fullname>Bogus</test:fullname>
</test:getEmployeeIdRequest>
</soapenv:Body>
</soapenv:Envelope>
Returned Fault:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server</faultcode>
<faultstring>EmployeeNotFoundException</faultstring>
<detail>
<ns2:EmployeeNotFoundFault
xmlns:ns2="http://test.webservices.bat.mathworks.com">
<ns2:severity>Cataclysmic</ns2:severity>
<ns2:retryable>false</ns2:retryable>
</ns2:EmployeeNotFoundFault>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
Whatever name you give the message becomes the type of exception that the
service method throws; whatever element that message refers to is the type that
eventually appears in the details.
More reasons to stick to the top-down approach.
If the attachments don't get through, let me know and I'll in-line them.
-Eric
From: Manuel Darveau [mailto:[EMAIL PROTECTED]<mailto:[EMAIL PROTECTED]>]
Sent: Tuesday, November 18, 2008 10:10 AM
To: [email protected]<mailto:[email protected]>
Subject: Re: AXIS2-3239, 3443
Hi,
I digged in the code and I think the fix should be around
org.apache.axis2.util.MessageContextBuilder:614 or directly on
AxisFault.makeFault().
I have a workaround that consist of injecting the detail on the generated
AxisFault.
For example, if my operation's wsdl is:
...
<xs:schema attributeFormDefault="qualified" elementFormDefault="unqualified"
targetNamespace="http://ws.ACME.com">
<xs:complexType name="Exception">
<xs:sequence>
<xs:element minOccurs="0" name="Exception" nillable="true"
type="xs:anyType"/>
</xs:sequence>
</xs:complexType>
<xs:element name="UnauthorizedAccessException">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="UnauthorizedAccessException"
nillable="true" type="ax21:UnauthorizedAccessException"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
...
<wsdl:operation name="getSomething">
<wsdl:input message="ns:getSomethingRequest" wsaw:Action="urn:getSomething"/>
<wsdl:output message="ns:getSomethingResponse"
wsaw:Action="urn:getSomethingResponse"/>
<wsdl:fault message="ns:UnauthorizedAccessException"
name="UnauthorizedAccessException"
wsaw:Action="urn:getSomethingUnauthorizedAccessException"/>
</wsdl:operation>
...
I can do in my service:
AxisFault af = AxisFault.makeFault(new UnauthorizedAccessException());
af.setDetail(new OMElementImpl("UnauthorizedAccessException", new
OMNamespaceImpl("http://ws.ACME.com", "whatever_alias"), new OMDOMFactory()));
throw af;
Note that I can't write a generic exception handler that will trap any
exception and inject the details since I don't know how to determine the
namespace used when defining the exception in the WSDL.
I *think* it will always be the service namespace but I am not sure. Also, I
don't this the "new OMDOMFactory()" part is really clean...
Any other solution?
Manuel
On Tue, Nov 18, 2008 at 9:44 AM, Eric Decosta <[EMAIL PROTECTED]<mailto:[EMAIL
PROTECTED]>> wrote:
I'm interested in a fix as well; it seems that part of the issue is that
AxisFault.makeFault() doesn't fill-in the Detail element of the Fault.
Following this example: :
http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/integration/test/org/apache/axis2/engine/util/FaultThrowingService.java?view=markup
You can generate just about anything you want for a Fault, but I'd expect that
if I specified something in the soap:fault for the service that Axis2 handle
things automatically.
I'm just making some guesses here as I haven't spent much time rummaging around
in the Axis2 code base.
-Eric
From: Manuel Darveau [mailto:[EMAIL PROTECTED]<mailto:[EMAIL PROTECTED]>]
Sent: Monday, November 17, 2008 4:21 PM
To: [email protected]<mailto:[email protected]>
Subject: AXIS2-3239, 3443
Hi all,
I known this is a tough question (and most probably better suited for axis-dev)
but do you have any idea when bug 3239 (and eventually 3443) will be fixed.
Do you have a target?
In short, the bug is about custom exception handling in the code first
approach. When you develop a service that throws custom exception(s), the WSDL
is correctly created including the custom faults but the resulting
implementation always convert custom exceptions into AxisFault.
This make it difficult/impossible for clients to catch custom/specific
exception.
This is not a show stopper but definitely an annoyance for me. I know you will
say: "it's open source, you can propose a patch" but I would like to know if a
fix is already in progress.
Do you have any pointer for me on where to look for a fix?
Thank you!
Manuel
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]<mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: [EMAIL PROTECTED]<mailto:[EMAIL PROTECTED]>