[ http://issues.apache.org/jira/browse/AXISCPP-720?page=all ]
Henrik Nordberg updated AXISCPP-720:
------------------------------------
Attachment: konga_database_infoprovider.1.2.wsdl
This is the older file that causes the broken code to be generated.
> Returning Array of complex type is broken
> -----------------------------------------
>
> Key: AXISCPP-720
> URL: http://issues.apache.org/jira/browse/AXISCPP-720
> Project: Axis-C++
> Type: Bug
> Components: Serialization, WSDL processing - Doc
> Versions: current (nightly)
> Environment: Windows & Linux
> Reporter: Henrik Nordberg
> Attachments: konga_database_infoprovider.1.2.wsdl,
> konga_database_infoprovider.wsdl
>
> There is a problem with the way arrays of complex types are being serialized
> before they are returned to the client from the web service. The problem went
> away when returned an object that contained the array (different classes
> where then generated for the array, see below). I think the problem is the
> way the stubs are generated for the case when a complex array is retured
> directly and not as part of a class.
> First I had the following interface on which I ran Java2WSDL and then WSDL2WS:
> public interface DatabaseInfoProvider {
> WsDatabaseObject[] getDatabaseObjects(String sUser, String sPassword,
> String connect, String objectTypes[], String searchString);
> }
> where
> public class WsDatabaseObject {
> public String sObjectType; // TABLE, VIEW, SP, SYNONYM
> public String sObjectName;
> public WsDatabaseColumn[] Columns;
> }
> where
> public class WsDatabaseColumn {
> public String name;
> public Boolean isPrimaryKey;
> }
> Here is the important part:
> The generated code for the array looks like:
> typedef struct WsDatabaseObject_ArrayTag
> {
> WsDatabaseObject** m_Array; // <-- BUG MAY BE HERE
> int m_Size;
> } WsDatabaseObject_Array;
> Then I change the interface to:
> public interface DatabaseInfoProvider {
> WsDatabaseInfo getDatabaseObjects(String sUser, String sPassword,
> String connect, String objectTypes[], String searchString);
> }
> where
> public class WsDatabaseInfo {
> public WsDatabaseObject[] dbInfo;
> }
> Note that the only difference is that I now return a class containing the
> array, instead of returning the array itself as was the case above.
> The code for the array now looks like:
> typedef struct WsDatabaseObject_ArrayTag
> {
> WsDatabaseObject* m_Array; // NOTE: just one * used
> int m_Size;
> } WsDatabaseObject_Array;
> The same thing is true for the nested array ( public WsDatabaseColumn[]
> Columns; ). I.e., in the code generated by from the first version of the
> interface defined in Java, WsDatabaseColumn_ArrayTag has WsDatabaseColumn**
> m_Array;, but in the second version it has WsDatabaseColumn* m_Array;.
> The first version crashes when serializing the result to be sent back to the
> client. The engine code seems to assume that the arrays are defined as T*
> m_Array and not T** m_Array.
--
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