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 "Detelin Yordanov (JIRA)" <ji...@apache.org> on 2008/09/10 16:40:44 UTC

[jira] Created: (AXIS2-4026) ClassCastException when serializing simple-typed multidimensional array bean fields

ClassCastException when serializing simple-typed multidimensional array bean fields
-----------------------------------------------------------------------------------

                 Key: AXIS2-4026
                 URL: https://issues.apache.org/jira/browse/AXIS2-4026
             Project: Axis 2.0 (Axis2)
          Issue Type: Bug
          Components: adb
    Affects Versions: nightly
         Environment: Tomcat 5.5.26, JDK 1.5.0_11
            Reporter: Detelin Yordanov


Hi guys,
   I found a problem in the latest multidimensional array support stuff added by Amila. The problem appears when serializing a response bean containing
a simple-typed multidimensional array field, e.g.:

public class SimpleBean {
	public int[][] numbers;

	public int[][] getNumbers() {
		return numbers;
	}

	public void setNumbers(int[][] numbers) {
		this.numbers = numbers;
	}
}

When serializing this to XML on the server side an exception gets thrown:
Caused by: java.lang.ClassCastException: [I
        at org.apache.axis2.databinding.utils.reader.ADBXMLStreamReaderImpl.processProperties(ADBXMLStreamReaderImpl.java:948)
        at org.apache.axis2.databinding.utils.reader.ADBXMLStreamReaderImpl.next(ADBXMLStreamReaderImpl.java:833)
        at org.apache.axis2.util.StreamWrapper.next(StreamWrapper.java:71)
        at org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:506)
        at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:161)

The reason for this seems to be the code in the ADBXMLStreamReaderImpl that handles array types:

} else if (propertyValue.getClass().isArray()) {
            // this is an arrary object and we need to get the pull parser for that
            Object[] objectArray = (Object[]) propertyValue;
            if (objectArray.length == 0) {
                //advance the index
                currentPropertyIndex = currentPropertyIndex + 2;
                return processProperties();
            } else {


The propertyValue here happens to be int[], and trying to cast it to Object[] causes the exception.
The real reason for propertyValue being int[] (not Integer[] for example) is hidden in the BeanUtils.getPullParser(..) method where array fields are handled:
(See line 164 of BeanUtil.java at rev 692771):

Object value;
if (readMethod != null) {
    readMethod.setAccessible(true);
    value = readMethod.invoke(beanObject, null);
}

The problem is due to a subtle change in the Java reflection API from 1.4.2 to 1.5.0, in 1.5.0 a new sentence appears describing the return type:

"If the method completes normally, the value it returns is returned to the caller of invoke; if the value has a primitive type, it is first appropriately wrapped in an  
 object. However, if the value has the type of an array of a primitive type, the elements of the array are not wrapped in objects; in other words, an array of  
 primitive type is returned."

This means that when reading int[][] { new int[] {1, 2}, new int[] {3, 4} } and converting this to Object[], we get e.g.
new Object[] { int[] {1, 2}, new int[] {3, 4} }, 
here the elements in the Object array are one dimensional arrays of int and this is OK (these elements are Objects), but when trying to cast each element
to one dimensional array of Object in the ADBXMLStreamReaderImpl  we got the ClassCastException since this conversion is not possible, e.g. :

Object[] objArray = new Object[] { int[] {1, 2}, new int[] {3, 4} };
Object obj = objArray[0];   //FINE
Object[] intArray = (Object[])objArray[0];  //ClassCastException

It seems that some additional checks for primitive typed arrays are required.

Regards,
   Detelin

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: axis-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-dev-help@ws.apache.org


[jira] Resolved: (AXIS2-4026) ClassCastException when serializing simple-typed multidimensional array bean fields

Posted by "Amila Chinthaka Suriarachchi (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/AXIS2-4026?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Amila Chinthaka Suriarachchi resolved AXIS2-4026.
-------------------------------------------------

    Resolution: Fixed

use the array class to manipulate the objects array without casting.

> ClassCastException when serializing simple-typed multidimensional array bean fields
> -----------------------------------------------------------------------------------
>
>                 Key: AXIS2-4026
>                 URL: https://issues.apache.org/jira/browse/AXIS2-4026
>             Project: Axis 2.0 (Axis2)
>          Issue Type: Bug
>          Components: adb
>    Affects Versions: nightly
>         Environment: Tomcat 5.5.26, JDK 1.5.0_11
>            Reporter: Detelin Yordanov
>         Attachments: EchoService.aar, httplog.txt, stacktrace.txt
>
>
> Hi guys,
>    I found a problem in the latest multidimensional array support stuff added by Amila. The problem appears when serializing a response bean containing
> a simple-typed multidimensional array field, e.g.:
> public class SimpleBean {
> 	public int[][] numbers;
> 	public int[][] getNumbers() {
> 		return numbers;
> 	}
> 	public void setNumbers(int[][] numbers) {
> 		this.numbers = numbers;
> 	}
> }
> When serializing this to XML on the server side an exception gets thrown:
> Caused by: java.lang.ClassCastException: [I
>         at org.apache.axis2.databinding.utils.reader.ADBXMLStreamReaderImpl.processProperties(ADBXMLStreamReaderImpl.java:948)
>         at org.apache.axis2.databinding.utils.reader.ADBXMLStreamReaderImpl.next(ADBXMLStreamReaderImpl.java:833)
>         at org.apache.axis2.util.StreamWrapper.next(StreamWrapper.java:71)
>         at org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:506)
>         at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:161)
> The reason for this seems to be the code in the ADBXMLStreamReaderImpl that handles array types:
> } else if (propertyValue.getClass().isArray()) {
>             // this is an arrary object and we need to get the pull parser for that
>             Object[] objectArray = (Object[]) propertyValue;
>             if (objectArray.length == 0) {
>                 //advance the index
>                 currentPropertyIndex = currentPropertyIndex + 2;
>                 return processProperties();
>             } else {
> The propertyValue here happens to be int[], and trying to cast it to Object[] causes the exception.
> The real reason for propertyValue being int[] (not Integer[] for example) is hidden in the BeanUtils.getPullParser(..) method where array fields are handled:
> (See line 164 of BeanUtil.java at rev 692771):
> Object value;
> if (readMethod != null) {
>     readMethod.setAccessible(true);
>     value = readMethod.invoke(beanObject, null);
> }
> The problem is due to a subtle change in the Java reflection API from 1.4.2 to 1.5.0, in 1.5.0 a new sentence appears describing the return type:
> "If the method completes normally, the value it returns is returned to the caller of invoke; if the value has a primitive type, it is first appropriately wrapped in an  
>  object. However, if the value has the type of an array of a primitive type, the elements of the array are not wrapped in objects; in other words, an array of  
>  primitive type is returned."
> This means that when reading int[][] { new int[] {1, 2}, new int[] {3, 4} } and converting this to Object[], we get e.g.
> new Object[] { int[] {1, 2}, new int[] {3, 4} }, 
> here the elements in the Object array are one dimensional arrays of int and this is OK (these elements are Objects), but when trying to cast each element
> to one dimensional array of Object in the ADBXMLStreamReaderImpl  we got the ClassCastException since this conversion is not possible, e.g. :
> Object[] objArray = new Object[] { int[] {1, 2}, new int[] {3, 4} };
> Object obj = objArray[0];   //FINE
> Object[] intArray = (Object[])objArray[0];  //ClassCastException
> It seems that some additional checks for primitive typed arrays are required.
> Regards,
>    Detelin

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: axis-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-dev-help@ws.apache.org


[jira] Updated: (AXIS2-4026) ClassCastException when serializing simple-typed multidimensional array bean fields

Posted by "Detelin Yordanov (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/AXIS2-4026?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Detelin Yordanov updated AXIS2-4026:
------------------------------------

    Attachment: EchoService.aar

A service that can be used to demonstrate the problem, contains sources.

> ClassCastException when serializing simple-typed multidimensional array bean fields
> -----------------------------------------------------------------------------------
>
>                 Key: AXIS2-4026
>                 URL: https://issues.apache.org/jira/browse/AXIS2-4026
>             Project: Axis 2.0 (Axis2)
>          Issue Type: Bug
>          Components: adb
>    Affects Versions: nightly
>         Environment: Tomcat 5.5.26, JDK 1.5.0_11
>            Reporter: Detelin Yordanov
>         Attachments: EchoService.aar, httplog.txt, stacktrace.txt
>
>
> Hi guys,
>    I found a problem in the latest multidimensional array support stuff added by Amila. The problem appears when serializing a response bean containing
> a simple-typed multidimensional array field, e.g.:
> public class SimpleBean {
> 	public int[][] numbers;
> 	public int[][] getNumbers() {
> 		return numbers;
> 	}
> 	public void setNumbers(int[][] numbers) {
> 		this.numbers = numbers;
> 	}
> }
> When serializing this to XML on the server side an exception gets thrown:
> Caused by: java.lang.ClassCastException: [I
>         at org.apache.axis2.databinding.utils.reader.ADBXMLStreamReaderImpl.processProperties(ADBXMLStreamReaderImpl.java:948)
>         at org.apache.axis2.databinding.utils.reader.ADBXMLStreamReaderImpl.next(ADBXMLStreamReaderImpl.java:833)
>         at org.apache.axis2.util.StreamWrapper.next(StreamWrapper.java:71)
>         at org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:506)
>         at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:161)
> The reason for this seems to be the code in the ADBXMLStreamReaderImpl that handles array types:
> } else if (propertyValue.getClass().isArray()) {
>             // this is an arrary object and we need to get the pull parser for that
>             Object[] objectArray = (Object[]) propertyValue;
>             if (objectArray.length == 0) {
>                 //advance the index
>                 currentPropertyIndex = currentPropertyIndex + 2;
>                 return processProperties();
>             } else {
> The propertyValue here happens to be int[], and trying to cast it to Object[] causes the exception.
> The real reason for propertyValue being int[] (not Integer[] for example) is hidden in the BeanUtils.getPullParser(..) method where array fields are handled:
> (See line 164 of BeanUtil.java at rev 692771):
> Object value;
> if (readMethod != null) {
>     readMethod.setAccessible(true);
>     value = readMethod.invoke(beanObject, null);
> }
> The problem is due to a subtle change in the Java reflection API from 1.4.2 to 1.5.0, in 1.5.0 a new sentence appears describing the return type:
> "If the method completes normally, the value it returns is returned to the caller of invoke; if the value has a primitive type, it is first appropriately wrapped in an  
>  object. However, if the value has the type of an array of a primitive type, the elements of the array are not wrapped in objects; in other words, an array of  
>  primitive type is returned."
> This means that when reading int[][] { new int[] {1, 2}, new int[] {3, 4} } and converting this to Object[], we get e.g.
> new Object[] { int[] {1, 2}, new int[] {3, 4} }, 
> here the elements in the Object array are one dimensional arrays of int and this is OK (these elements are Objects), but when trying to cast each element
> to one dimensional array of Object in the ADBXMLStreamReaderImpl  we got the ClassCastException since this conversion is not possible, e.g. :
> Object[] objArray = new Object[] { int[] {1, 2}, new int[] {3, 4} };
> Object obj = objArray[0];   //FINE
> Object[] intArray = (Object[])objArray[0];  //ClassCastException
> It seems that some additional checks for primitive typed arrays are required.
> Regards,
>    Detelin

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: axis-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-dev-help@ws.apache.org


[jira] Updated: (AXIS2-4026) ClassCastException when serializing simple-typed multidimensional array bean fields

Posted by "Detelin Yordanov (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/AXIS2-4026?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Detelin Yordanov updated AXIS2-4026:
------------------------------------

    Attachment: httplog.txt
                stacktrace.txt

Http request response and stacktrace.

> ClassCastException when serializing simple-typed multidimensional array bean fields
> -----------------------------------------------------------------------------------
>
>                 Key: AXIS2-4026
>                 URL: https://issues.apache.org/jira/browse/AXIS2-4026
>             Project: Axis 2.0 (Axis2)
>          Issue Type: Bug
>          Components: adb
>    Affects Versions: nightly
>         Environment: Tomcat 5.5.26, JDK 1.5.0_11
>            Reporter: Detelin Yordanov
>         Attachments: EchoService.aar, httplog.txt, stacktrace.txt
>
>
> Hi guys,
>    I found a problem in the latest multidimensional array support stuff added by Amila. The problem appears when serializing a response bean containing
> a simple-typed multidimensional array field, e.g.:
> public class SimpleBean {
> 	public int[][] numbers;
> 	public int[][] getNumbers() {
> 		return numbers;
> 	}
> 	public void setNumbers(int[][] numbers) {
> 		this.numbers = numbers;
> 	}
> }
> When serializing this to XML on the server side an exception gets thrown:
> Caused by: java.lang.ClassCastException: [I
>         at org.apache.axis2.databinding.utils.reader.ADBXMLStreamReaderImpl.processProperties(ADBXMLStreamReaderImpl.java:948)
>         at org.apache.axis2.databinding.utils.reader.ADBXMLStreamReaderImpl.next(ADBXMLStreamReaderImpl.java:833)
>         at org.apache.axis2.util.StreamWrapper.next(StreamWrapper.java:71)
>         at org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:506)
>         at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:161)
> The reason for this seems to be the code in the ADBXMLStreamReaderImpl that handles array types:
> } else if (propertyValue.getClass().isArray()) {
>             // this is an arrary object and we need to get the pull parser for that
>             Object[] objectArray = (Object[]) propertyValue;
>             if (objectArray.length == 0) {
>                 //advance the index
>                 currentPropertyIndex = currentPropertyIndex + 2;
>                 return processProperties();
>             } else {
> The propertyValue here happens to be int[], and trying to cast it to Object[] causes the exception.
> The real reason for propertyValue being int[] (not Integer[] for example) is hidden in the BeanUtils.getPullParser(..) method where array fields are handled:
> (See line 164 of BeanUtil.java at rev 692771):
> Object value;
> if (readMethod != null) {
>     readMethod.setAccessible(true);
>     value = readMethod.invoke(beanObject, null);
> }
> The problem is due to a subtle change in the Java reflection API from 1.4.2 to 1.5.0, in 1.5.0 a new sentence appears describing the return type:
> "If the method completes normally, the value it returns is returned to the caller of invoke; if the value has a primitive type, it is first appropriately wrapped in an  
>  object. However, if the value has the type of an array of a primitive type, the elements of the array are not wrapped in objects; in other words, an array of  
>  primitive type is returned."
> This means that when reading int[][] { new int[] {1, 2}, new int[] {3, 4} } and converting this to Object[], we get e.g.
> new Object[] { int[] {1, 2}, new int[] {3, 4} }, 
> here the elements in the Object array are one dimensional arrays of int and this is OK (these elements are Objects), but when trying to cast each element
> to one dimensional array of Object in the ADBXMLStreamReaderImpl  we got the ClassCastException since this conversion is not possible, e.g. :
> Object[] objArray = new Object[] { int[] {1, 2}, new int[] {3, 4} };
> Object obj = objArray[0];   //FINE
> Object[] intArray = (Object[])objArray[0];  //ClassCastException
> It seems that some additional checks for primitive typed arrays are required.
> Regards,
>    Detelin

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: axis-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-dev-help@ws.apache.org