You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by "Davanum Srinivas (JIRA)" <ax...@ws.apache.org> on 2005/06/11 14:39:50 UTC
[jira] Assigned: (AXIS-1413) Axis deserialization of Arrays
[ http://issues.apache.org/jira/browse/AXIS-1413?page=all ]
Davanum Srinivas reassigned AXIS-1413:
--------------------------------------
Assign To: Davanum Srinivas
> Axis deserialization of Arrays
> ------------------------------
>
> Key: AXIS-1413
> URL: http://issues.apache.org/jira/browse/AXIS-1413
> Project: Apache Axis
> Type: Bug
> Components: Serialization/Deserialization
> Versions: 1.2 Beta
> Environment: Win2k Advanced server
> Reporter: Vikram Roopchand
> Assignee: Davanum Srinivas
>
> Hi,
> we are facing a peculiar problem. We have a setter and getter for
> java.lang.Object[], something like this :-
> void setValues(Object[] values);
> Object[] getValues();
> We use this to send/receive arrays of any type
> (Integer,String,Float,MyClassA,YourClassB). WSDL generated for such code
> via java2WSDL has array of xsd:anyType for this, which is okay.
> When the SOAP xml(via RPC) is sent from the Client (using Axis) it gets
> represented by it's XSD type for e.g.:-
> Please look at "values" element.
> <multiRef id="id19" soapenc:root="0"
> soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
> xmlns:ns17="http://localhost:8080/Contentbiz/sysTypes"
> xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
> xsi:type="ns17:CBAttributeValue">
> <name xsi:type="xsd:string">ct_NoOfEmployees</name>
> <dataType href="#id30" />
> <values soapenc:arrayType="xsd:int[2]" xsi:type="soapenc:Array">
> <item>12</item>
> <item>14</item>
> </values>
> <multipleValues xsi:type="soapenc:boolean">true</multipleValues>
> <validValue xsi:type="soapenc:boolean">true</validValue>
> <isDirty xsi:type="soapenc:boolean">false</isDirty>
> </multiRef>
> Our system is built in such a way that we use the Getter on the Server
> end and the "Type" (also sent from the client) and work with the Array
> so returned .
> Somewhat like:-
> //identify the data type
> DataType dataType = deserializedObject.getDataType();
> //retrieve the "typed" array
> getTypedArray(dataType,deserializedObject.getValues());
> Now comes our problem :-
> For all the Types which are our types (MyClassA,MyClassB) , the
> deserialiazedObject contains an array of the proper type , getValues
> will return an array of MyClassA objects.
> For Other types like Integer/Float/Boolean (not String) it is returning
> Object[] having the properly typed values within, which results for us
> into a ClassCastException for us when we use our getTypedArray method
> (this method assumes that Axis will return the correctly typed array).
> The Subsystem (Axis) in BeanPropertyTarget.set() handles it in such a
> way:-
> try {
> // Set the value on the bean property.
> // Use the indexed property method if the
> // index is set.
> if (index < 0) {
> pd.set(object, value);
> } else {
> pd.set(object, index, value);
> }
> } catch (Exception e) {
> try {
> // If an exception occurred,
> // see it the value can be converted into
> // the expected type.
> Class type = pd.getType();
>
> if (JavaUtils.isConvertable(value, type)) {
> value = JavaUtils.convert(value, type);
> if (index < 0)
> pd.set(object, value);
> else
> pd.set(object, index, value);
> } else {
> // It is possible that an indexed
> // format was expected, but the
> // entire array was sent. In such
> // cases traverse the array and
> // call the setter for each item.
> if (index == 0 &&
> value.getClass().isArray() &&
> !type.getClass().isArray()) {
> for (int i=0; i<Array.getLength(value); i++) {
> Object item =
> JavaUtils.convert(Array.get(value, i),
> type);
> pd.set(object, i, item);
> }
> } else {
> // Can't proceed. Throw an exception that
> // will be caught in the catch block below.
> throw e;
> }
> }
> In the CATCH block (It will come here for all basic xsd types , as code
> executed before it in ArrayListExtension marks it to be a int[] array
> and the setValues(Object[]) will fail with IllegalArgumentException), it
> is attempted to figure out the Type and Convert it to the one in the
> BeanPropertyDescriptor (which for us is Object[] class, which is okay
> since it is an anyType). But there is a small deviation , instead of
> identifying the underlying type (if it is an array) , CATCH block
> creates an array of Object[] and fills it up with the values of correct
> type. This results in the deserilialzedObject.getValues() resulting in
> an Object[] array instead of an Integer[] (as expected).
> This is a discrepancy as for some XSD types like xsd:string,
> xsd:dateTime it returns String[]/Calendar[] but for
> xsd:int,xsd:float,xsd:boolean etc. it does not.
> We would like to confirm whether or not do you consider this as a bug ,
> we did a slight modification to CATCH BeanPropertyTarget and everthing
> was working fine , :-
> catch {
> // If an exception occurred,
> // see it the value can be converted into
> // the expected type.
> Class type = pd.getType();
>
> //Vikram - INFY - START
> if (value.getClass().isArray() &&
> value.getClass().getComponentType().isPrimitive()
> && type.isArray() &&
> type.getComponentType().equals(Object.class))
> {
> //we make our own array type here.
> type =
> Array.newInstance(JavaUtils.getWrapperClass(value.getClass().getComponen
> tType()),0).getClass();
> }
> //Vikram - INFY - END
> if (JavaUtils.isConvertable(value, type)) {
> value = JavaUtils.convert(value, type);
> if (index < 0)
> pd.set(object, value);
> else
> pd.set(object, index, value);
> } else {
> // It is possible that an indexed
> // format was expected, but the
> // entire array was sent. In such
> // cases traverse the array and
> // call the setter for each item.
> if (index == 0 &&
> value.getClass().isArray() &&
> !type.getClass().isArray()) {
> for (int i=0; i<Array.getLength(value); i++) {
> Object item =
> JavaUtils.convert(Array.get(value, i),
> type);
> pd.set(object, i, item);
> }
> } else {
> // Can't proceed. Throw an exception that
> // will be caught in the catch block below.
> throw e;
> }
> }
> Only for primitive Arrays,We change the "type" to take in the underlying
> type of the "value" array. This will work only for primitive arrays and
> only when the bd has "type" set to Object[] (anytype).
> I would appreciate a quick response from your side as most of our system
> depends on this functionality.
> Thanks a lot,
> Vikram Roopchand
> Programmwer Analyst,
> INFOSYS Technologies Ltd. - Pune.
> India
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira