Amila Suriarachchi wrote:
On 6/12/07, *Dennis Sosnoski* <[EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]>> wrote:
I think it would be much cleaner to fix the code generation
handling, so
that the same exception can be used by multiple methods. Why
complicate
the interface with multiple classes for the same data?
So my response to Glen's questions would be that the message name
should
be based on just the Exception type, and the generated exception class
should just use the message name. If this were done correctly it would
also eliminate the need to have a data object for each
Fault/Exception
class, which I think is one of the more awkward parts of the current
Axis2 API - you need to use constructs like:
As I understood here you are suggesting to use one message for the
same exception classes in
java2wsdl.
Yes.
AddDuplicateFaultException fault = new
AddDuplicateFaultException("Duplicate book");
fault.setFaultMessage(new AddDuplicateFaultData());
throw fault;
where you have to first create the exception, then create a data
object
and set it on the exception, and only then throw the exception.
This is
a very counterintuitive way of doing things (especially when
there's no
actual data associated with the exception/fault),
What you are suggesting here? Adding the detail message to the
constructor?
I'm showing what's required by the current generated code. If there is a
meaningful message data object it would certainly be useful to have a
constructor that takes that object as a parameter, but the main problem
is that the message data object is always required by the current code.
but if you forget to
set the required message object you'll get a NPE when Axis2 tries to
convert the exception to a fault.
I think this is an Axis2 bug since Detail element is optional.
Sounds good to me. But here's the current message receiver code
generated for ADB (the others are essentially the same, as I remember):
} catch (AddDuplicateFaultException e) {
msgContext.setProperty(org.apache.axis2.Constants.FAULT_NAME,
"addDuplicate");
org.apache.axis2.AxisFault f = createAxisFault(e);
f.setDetail(toOM(e.getFaultMessage(), false));
throw f;
}
Note that the message data object has to be present and non-null for
this code to work (the toOM call, in particular). The client-side code
also requires a message data object to be present. The Fault element
name is used to determine the type of exception to be generated, but
then the element is also passed to the fromOM method to create the
associated message data object. So the current requirement of a unique
message data object for each exception type is built into the code
generation on both client and server sides. This should be changed so
that there doesn't need to be a message data object type for faults with
no content (corresponding to an exception that only provides an error
message), which in WSDL terms would be:
<element name="empty">
<complexType>
<sequence/>
</complexType>
</element>
...
<wsdl:message name="emptyFault">
<wsdl:part element="wns:empty" name="fault"/>
</wsdl:message>
Right now, this creates an "Empty" class as the message data object for
the generated exception class. Instead, we should just have the
Fault/Exception class.
- Dennis
--
Dennis M. Sosnoski
SOA and Web Services in Java
Axis2 Training and Consulting
http://www.sosnoski.com - http://www.sosnoski.co.nz
Seattle, WA +1-425-939-0576 - Wellington, NZ +64-4-298-6117
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]