-
1. Re: @WebRemote: problem with client site instantiation of ob
shane.bryzak Aug 2, 2006 3:00 AM (in response to rlhr)What Javascript do you have on the client?
-
2. Re: @WebRemote: problem with client site instantiation of ob
rlhr Aug 2, 2006 3:16 AM (in response to rlhr)So I have the following javascript:
<script type="text/javascript" src="/peanutcafe/seam/remoting/resource/remote.js">/* IE */</script> <script type="text/javascript" src="/peanutcafe/seam/remoting/interface.js?myManager">/* IE */</script> <script type="text/javascript"> function getList(id){ var myManager = Seam.Component.getInstance("myManager"); var fctCallback = function(myList) { for (var idx = 0; idx < myList.length; idx++) { for(var field in myList[idx]) { alert(field + " : " + myList[idx][field]); } } myManager.getMyList(id, fctCallback ); } </script>
The list has been populated with the right number of object, but the javascript objects don't seems to be instantiated properly.
Did I miss anything? -
3. Re: @WebRemote: problem with client site instantiation of ob
shane.bryzak Aug 2, 2006 3:33 AM (in response to rlhr)Your javascript looks ok. Is SelectItem an interface? If it is, then there are still some outstanding issues with how remoting deals with interfaces.
-
4. Re: @WebRemote: problem with client site instantiation of ob
rlhr Aug 2, 2006 3:53 AM (in response to rlhr)This is the javax.faces.model.SelectItem class that also implements java.io.Serializable
-
5. Re: @WebRemote: problem with client site instantiation of ob
shane.bryzak Aug 2, 2006 4:30 AM (in response to rlhr)What does /peanutcafe/seam/remoting/interface.js?myManager produce for the SelectItem class? Looking at the MyFaces implementation of SelectItem, it seems that they are using a non-standard naming convention for their javabean fields... ie. _value instead of just value. This might be what's messing up the stubs for this class.
-
6. Re: @WebRemote: problem with client site instantiation of ob
rlhr Aug 2, 2006 5:10 AM (in response to rlhr)This is what is generated:
Seam.Remoting.type.javax$faces$model$SelectItem = function() { } Seam.Remoting.type.javax$faces$model$SelectItem.__name = "javax.faces.model.SelectItem"; Seam.Remoting.type.javax$faces$model$SelectItem.__metadata = [ ]; Seam.Remoting.registerType(Seam.Remoting.type.javax$faces$model$SelectItem);
The field haven't been produced. As you said, that might just come from this strange naming convention they used.
I didn't think of checking the implementation of that javabean class!
I could just implement my own, but I'm not sure it is going to work properly with the selectOneMenu tag from the http://java.sun.com/jsf/html library.
Maybe we should ask the MyFaces team whether they could change this naming...
Thanks a lot for you help.
Richard -
7. Re: @WebRemote: problem with client site instantiation of ob
shane.bryzak Aug 2, 2006 8:02 AM (in response to rlhr)What you could do is implement your own javascript stub and register it with Seam.Remoting.registerType(), but it would be interesting to see what actual XML is being sent in response to your remoting call. You can enable debugging mode with Seam.Remoting.setDebug(true) which will show you the XML packets that are sent back and forth between the browser and the server. As far as I recall, the field values for the SelectItem object should still be sent back even if they don't have a matching getter/setter method.
-
8. Re: @WebRemote: problem with client site instantiation of ob
rlhr Aug 2, 2006 9:04 AM (in response to rlhr)Here are the XML packets:
Wed Aug 02 2006 14:56:54 GMT+0200 (Romance Daylight Time): Request packet: <envelope> <header> <context><conversationId>10</conversationId></context> </header> <body> <call component="myManager" method="getMyList" id="1"> <params> <param> <str>ID:12</str> </param> </params> <refs></refs> </call> </body> </envelope> Wed Aug 02 2006 14:56:55 GMT+0200 (Romance Daylight Time): Response packet: <envelope> <header> <context><conversationId>12</conversationId></context> </header> <body> <result id="1"> <value> <bag> <element><ref id="0"/></element> <element><ref id="1"/></element> <element><ref id="2"/></element> </bag> </value> <refs> <ref id="0"><bean type="javax.faces.model.SelectItem"></bean></ref> <ref id="1"><bean type="javax.faces.model.SelectItem"></bean></ref> <ref id="2"><bean type="javax.faces.model.SelectItem"></bean></ref> </refs> </result> </body> </envelope>
So if I write a stub for SelectItem and register it, Seam won't generate one and pick that one up. Is that what you mean? -
9. Re: @WebRemote: problem with client site instantiation of ob
rlhr Aug 2, 2006 3:10 PM (in response to rlhr)So after registering myManager, I registered this classe:
Seam.Remoting.type.javax$faces$model$SelectItem = function() { this._value = null; this._label = null; Seam.Remoting.type.javax$faces$model$SelectItem.prototype.getValue = function() { return this._value; } Seam.Remoting.type.javax$faces$model$SelectItem.prototype.getLabel = function() { return this._label; } Seam.Remoting.type.javax$faces$model$SelectItem.prototype.setValue = function(_value) { this._value = _value; } Seam.Remoting.type.javax$faces$model$SelectItem.prototype.setLabel = function(_label) { this._label = _label; } } Seam.Remoting.type.javax$faces$model$SelectItem.__name = "javax.faces.model.SelectItem"; Seam.Remoting.type.javax$faces$model$SelectItem.__metadata = [ {field: "_value", type: "str"}, {field: "_label", type: "str"}, ]; Seam.Remoting.registerType(Seam.Remoting.type.javax$faces$model$SelectItem);
Looking at the javascript code, it should then replace the generated stub.
Then I tried again without success... -
10. Re: @WebRemote: problem with client site instantiation of ob
shane.bryzak Aug 2, 2006 4:05 PM (in response to rlhr)"rlhr" wrote:
Wed Aug 02 2006 14:56:55 GMT+0200 (Romance Daylight Time): Response packet: <envelope> <header> <context><conversationId>12</conversationId></context> </header> <body> <result id="1"> <value> <bag> <element><ref id="0"/></element> <element><ref id="1"/></element> <element><ref id="2"/></element> </bag> </value> <refs> <ref id="0"><bean type="javax.faces.model.SelectItem"></bean></ref> <ref id="1"><bean type="javax.faces.model.SelectItem"></bean></ref> <ref id="2"><bean type="javax.faces.model.SelectItem"></bean></ref> </refs> </result> </body> </envelope>
It looks like the field values for SelectItem aren't being serialized after all. I'll take a look at this today and see if I can come up with something that will work for the cases where the field naming doesn't match the getter/setter names. -
11. Re: @WebRemote: problem with client site instantiation of ob
rlhr Aug 2, 2006 4:28 PM (in response to rlhr)Thanks a lot.
-
12. Re: @WebRemote: problem with client site instantiation of ob
shane.bryzak Aug 2, 2006 9:36 PM (in response to rlhr)I've checked in some changes to CVS which hopefully should fix your issue. It would be great if you could try this out for me and let me know if it works for you. One other neat thing that is now supported is explicit importing of non-component classes, so for example you can now import/browse this:
/seam/remoting/interface.js?javax.faces.model.SelectItem
to generate a client stub for the SelectItem class. -
13. Re: @WebRemote: problem with client site instantiation of ob
rlhr Aug 3, 2006 5:46 AM (in response to rlhr)That's really cool.
I'm in the middle of something else right now and broke my app, but I still my be able to try your change today and give you some feedback.
Thanks a lot. -
14. Re: @WebRemote: problem with client site instantiation of ob
rlhr Aug 3, 2006 10:06 AM (in response to rlhr)I finally got the opportunity to test the code you checked in.
I downloaded jboss-seam-CVS.20060803.zip (which was created after your post).
The interface created for the SelectItem class is:Seam.Remoting.type.javax$faces$model$SelectItem = function() { this.value = undefined; this.label = undefined; this.disabled = undefined; this.description = undefined; } Seam.Remoting.type.javax$faces$model$SelectItem.__name = "javax.faces.model.SelectItem"; Seam.Remoting.type.javax$faces$model$SelectItem.__metadata = [ {field: "value", type: "bean"}, {field: "label", type: "str"}, {field: "disabled", type: "bool"}, {field: "description", type: "str"}]; Seam.Remoting.registerType(Seam.Remoting.type.javax$faces$model$SelectItem);
The xml received back from the server is:<envelope> <header> <context><conversationId>11</conversationId></context> </header> <body> <result id="1"> <value> <bag> <element><ref id="0"/></element> <element><ref id="1"/></element> <element><ref id="2"/></element> </bag> </value> <refs> <ref id="0"> <bean type="javax.faces.model.SelectItem"> <member name="value"><number>-1</number></member> <member name="label"><str>AAAAAA</str></member> <member name="disabled"><bool>false</bool></member> <member name="description"><null/></member> </bean> </ref> <ref id="1"> <bean type="javax.faces.model.SelectItem"> <member name="value"><number>2</number></member> <member name="label"><str>BBBBB</str></member> <member name="disabled"><bool>false</bool></member> <member name="description"><null/></member> </bean> </ref> <ref id="2"> <bean type="javax.faces.model.SelectItem"> <member name="value"><number>3</number></member> <member name="label"><str>CCCCC</str></member> <member name="disabled"><bool>false</bool></member> <member name="description"><null/></member> </bean> </ref> </refs> </result> </body> </envelope>
I was able to read the value fine using the properties "label" and "value".
I noticed that the getters and setters are not generated for that bean.
Is that in purpose?
Anyway, that solve my problem. Awesome job!
I didn't try the other functionnality you mentioned but actually I might also need it soon and therefore test it at the same time.
Thanks