Hi Luca,  the parameter orders on the client side should not matter. The server 
retrieves input using name/value pairs. Having this said, I cant guarantee you 
that it is bug-free. ;-) I just added a REST system test using JSON as content 
type 
(trunk\systests\src\test\java\org\apache\cxf\systest\rest\RestClientServerBookTest.java).
 If you have access to svn and feel comfortable working on CXF source code, you 
can try to modify the test case to see if the problem can be reproduced based 
on that system test. 

Thanks,
Jervis

-----Original Message-----
From: Luca Ceppelli [mailto:[EMAIL PROTECTED]
Sent: 2007?7?15? 23:58
To: cxf-user@incubator.apache.org
Subject: Adobe FLex 2 JSON client: problem with parameter order




Hi all.


 


I’m trying to create a Adobe Flex 2 client which has to
communicate with a cxf service exposed through Json.  I used the following code 
for the initialization of the service.


 


ServerFactoryBean sf = new ServerFactoryBean();


 


Class serviceClass = 
JsonServiceBean.class.getClassLoader().loadClass(getServiceClass());


sf.setServiceClass(serviceClass);


 


Object instance;


if (getServiceBeanInstance() == null) { 


Class serviceImplClass =
JsonServiceBean.class.getClassLoader().loadClass(getServiceBean());


    instance = serviceImplClass.newInstance();


 


} else {


    instance =
getServiceBeanInstance();


}


 


sf.setServiceBean(instance);


 


sf.setAddress(getAddress());


 


 


sf.setBindingId("http://cxf.apache.org/bindings/xformat";);


sf.setTransportId("http://schemas.xmlsoap.org/wsdl/http/";);


 


sf.getServiceFactory().setWrapped(isWrapped());


Map<String, Object> properties = new
HashMap<String, Object>();


properties.put("Content-Type",
"text/plain");


 


// Set up the JSON StAX implementation


Map<String, String> nstojns = new HashMap<String,
String>();


nstojns.put("http://cxf.apache.org/bindings/xformat";,
"xformat");


 


Iterator<Entry<String, String>> iter =
getNamespaces().entrySet().iterator();


 


while (iter.hasNext()) {


    Entry<String,
String> entry = (Entry<String, String>) iter.next();


   
nstojns.put(entry.getKey(),entry.getValue());


}


 


MappedXMLInputFactory xif = new
MappedXMLInputFactory(nstojns);


properties.put(XMLInputFactory.class.getName(), xif);


 


org.codehaus.jettison.mapped.Configuration conf = new
org.codehaus.jettison.mapped.Configuration();


conf.setXmlToJsonNamespaces(nstojns);


 


 


MappedXMLOutputFactory xof = new
MappedXMLOutputFactory(conf);


properties.put(XMLOutputFactory.class.getName(), xof);


 


sf.setProperties(properties);


Server server = sf.create();


 


The signature of the remote method is:


 


Result createUser(Token token, String email, String userPwd,
String name, String surname);


 


The generated wsdl has as expected the following schema of
the message element


 


<xs:element name="createUser">


 <xs:complexType>


  <xs:sequence>


   <xs:element
name="arg00" nillable="true"
type="tns:token"/>


   <xs:element
name="arg11" nillable="true"
type="xs:string"/>


   <xs:element
name="arg22" nillable="true"
type="xs:string"/>


   <xs:element
name="arg33" nillable="true" type="xs:string"/>


   <xs:element
name="arg44" nillable="true"
type="xs:string"/>


 </xs:sequence>


 </xs:complexType>


</xs:element>


            


With the following JSON request:


 


{createUser:{token:{"token":"12345678"},
email:[EMAIL PROTECTED], userPwdID:pwd, name:Luca, surname:Ceppelli}}


 


the service works fine.


 


 


 


But, when the Flex 2 Client generates the request, the
parameters order is not respected. 
Following the code I used for the JSON service invocation:


 


import com.adobe.serialization.json.JSON;


 


…


 


httpService.request = JSON.encode({createUserss:{token:token,
email:emailID.text, userPwdID:userPwdID.text, name:nameID.text,
surname:surnameID.text}});


 


 


The problem is related with the Action Scripts Object: the
properties: token, name, email, ecc are stored in an internal map of the
root object. When the JSON.encode() static method accesses to the map
for retrieving the properties, theirs order is not respect. (I suspect that the
same problem could be happening also with a JAVA Script client).


 


I think that the easy solution is to use, instead of the SEQUENCE
complex type, the ALL complex type. What do you think about?


 


How is it possible to specify to use ALL instead of SEQUENCE
when the JSON service is created?


 


Have you other idea/suggestions to overcome this problem?


 


Thanks,


Luca.



      ___________________________________ 
L'email della prossima generazione? Puoi averla con la nuova Yahoo! Mail: 
http://it.docs.yahoo.com/nowyoucan.html

----------------------------
IONA Technologies PLC (registered in Ireland)
Registered Number: 171387
Registered Address: The IONA Building, Shelbourne Road, Dublin 4, Ireland

Reply via email to