PDA

Volledige versie bekijken : nieuw object maken met behulp van constructor geeft errors


Sjoedzj
%Europe/Berlin %532 %2008, 13:47
Hallo,

Ik zit met een bug waar ik niet uitkom.
Ik heb een flex applicatie waar ik, als er op de button geclickt wordt, met een remote object een functie getUsers aanroep aan de server side. Ik krijg uiteindelijk een ArrayCollection binnen waar ook daadwerkelijk in een Object de user informatie in zit. Als ik deze probeer te casten naar een User Object of als ik een nieuwe probeer aan te maken zoals hieronder krijg ik de volgende error:

ArgumentError: Error #1063: Argument count mismatch on pojo::User(). Expected 3, got 0.

Als ik een constructor User() maak en user opbouw zoals in het stukje in commentaar dan werkt het wel...

code:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx: Script>
<![CDATA[
import mx.rpc.events.ResultEvent;
import mx.collections.ArrayCollection;
import vo.User;


public var users:ArrayCollection = new ArrayCollection();
[B]
public function handleUserResult(event:ResultEvent):void{
var result:ArrayCollection=event.result as ArrayCollection;
for(var i:int=0;i<result.length;i++){
var obj: Object = result.getItemAt(i);
var user:User = new User(obj.firstName, obj.lastName, obj.age);
//var user:User = new User();
//user.firstName = obj.firstName;
//user.lastName = obj.lastName;
//user.age = obj.age;
users.addItem(user);
}

}
]]>
</mx: Script>
<mx:RemoteObject id="srv" destination="UserService" fault="Alert.show(event.fault.toString())" >
<mx:method name="getUsers" result="handleUserResult(event)" fault="Alert.show(event.fault.message)" />
</mx:RemoteObject>
<mx:Tree id="tree" dataProvider="{users}" labelField="lastName" x="115" y="54" width="200" height="300">
</mx:Tree>
<mx:Button x="333" y="464" label="Button" click="srv.getUsers()"/>
</mx:Application>


User.as:

package vo
{
[RemoteClass(alias="vo.User")]
[Bindable]
public class User
{
public var firstName: String;
public var lastName: String;
public var age:int;

public function User(firstName: String, LastName: String, age:int){
this.firstName = firstName;
this.lastName = lastName;
this.agec= age;
}


public function toString(): String{
return firstName+" "+lastName;
}
}
}

TheDutch
%Europe/Berlin %618 %2008, 15:50
Die error die je krijgt kan alleen voorkomen bij deze regel:

var user:User = new User();

En nooit bij deze:

var user:User = new User(obj.firstName, obj.lastName, obj.age);

Sjoedzj
%Europe/Berlin %675 %2008, 17:12
Ik krijg hem toch echt bij die regel... :S
Ik heb ook al gezoht op internet en daar had men het over een probleem met events, maar ik zie daar ook geen fouten

LLMM
%Europe/Berlin %440 %2008, 11:34
Je moet met een event class werken.
Je classe kan je laten staan maar er moet nog een event classe bij.

vb

package Events
{
import User;

import flash.events.Event;

public class User_Event extends Event
{
public var data:user;

public function ToolProperties_Event(type:String,data:User)
{
super(type);
this.data = data;
}

override public function clone():Event
{
return new User_Event(type,data);
}
}
}


Wanneer je de click uitvoerd in de main appl. moet je een dispatchEvent doen !

vb


private function getUsers():void
{
var Propdata:User = new User(firstName,lastName,age);
var e:User_Event = new User_Event("data",Propdata);
dispatchEvent(e);
}


Je moet natuurlijk nog de firstname , lastname , age invullen

Sjoedzj
%Europe/Berlin %549 %2008, 14:11
Ik heb de User_Event classe gemaakt en de volgende code geedit:

public function handleUserResult(event:ResultEvent):void{
var result:ArrayCollection=event.result as ArrayCollection;
for(var i:int=0;i<result.length;i++){
var obj: Object = result.getItemAt(i);
var user:User = new User(obj.firstName, obj.lastName, obj.age);
var e:User_Event = new User_Event("data",user);
dispatchEvent(e);

//var user:User = new User();
//user.firstName = obj.firstName;
//user.lastName = obj.lastName;
//user.age = obj.age;
users.addItem(user);
}

}

Maar ik krijg nog steeds dezelfde error, het maken van het User Object gebeurt ook nog steeds met die constructor waarbij die error ontstaat.


---Edit---

Ik kan als ik een constructor User() gebruik wel casten naar User:

public function handleUserResult(event:ResultEvent):void{
var result:ArrayCollection=event.result as ArrayCollection;
for(var i:int=0;i<result.length;i++){
var user:User = result.getItemAt(i) as User;

/* var user:User = new User(obj.firstName, obj.lastName, obj.age);
var user:User = new User();
user.firstName = obj.firstName;
user.lastName = obj.lastName;
user.age = obj.age; */

users.addItem(user);
}
}

Het lijkt er dus op dat je geen constructors met argumenten mag gebruiken bij remoteObjects ??:S

LLMM
%Europe/Berlin %610 %2008, 15:39
probeer dit eens


public function handleUserResult(event:ResultEvent):void{
var result:ArrayCollection=event.result as ArrayCollection;

var firstName:String = result.getItemAt(0);
var lastName:String = result.getItemAt(1);
var age:String = result.getItemAt(2);

var user:User = new User(firstName, lastName, age);
var e:User_Event = new User_Event("data",user);
dispatchEvent(e);

}


nu weet ik niet in welk mxml je de data terug wil oproepen ,
daar zou je dan vb kunnen schrijven

private function init():void
{ Application.application.addEventListener("data", getProperties); }

private function getProperties(e:User_Event):void
{
var cl:User = e.data;

var ontvangen_firstName:String = cl.firstname;
var ontvangen_lastName:String = cl.lastName;
var ontvangen_age:String = cl.age;
}

Sjoedzj
%Europe/Berlin %661 %2008, 16:52
Dat gaat ook niet werken want die User constructor die je aanroept in de handleUserResult(event:ResultEvent) veroorzaakt errors. Daarnaast krijgt wordt er vanuit de server kant een ArrayList van User objecten dus getItemAt(0) is het eerste User object en niet de firstName.

Het is ook een error dat ik geen argumenten meegeef terwijl er 3 verwacht worden terwijl er duidelijk 3 argumenten in de constructor zitten.
Ik dacht ook nog even dat het aan User(...) lag omdat dit dezelfde syntax is als het casten naar een User object maar ik krijg hetzelfde probleem hier:

public function handleUserResult(event:ResultEvent):void{
var result:ArrayCollection=event.result as ArrayCollection;
for(var i:int=0;i<result.length;i++){
var User: User = result.getItemAt(i) as User;
users.addItem(user);
}.

en als ik de constructor verwijder uit de User Objecten doet dit het wel.

LLMM
%Europe/Berlin %373 %2008, 09:57
is het probleem nu opgelost dan ?

Sjoedzj
%Europe/Berlin %500 %2008, 13:00
Nee, eigenlijk niet. Ik kan namelijk nog steeds geen constructors gebruiken met meerdere argumenten. Ik heb het vermoeden dat het een bug is in Flex 3/Actionscript.

TheDutch
%Europe/Berlin %531 %2008, 13:44
Dit is geen bug in ActionScript 3 of Flex 3. Er zit ergens een fout in je code daar ben ik van overtuigd. ZIP anders even je hele project en voeg hem toe aan het onderwerp, dan kan ik er naar kijken :).

Sjoedzj
%Europe/Berlin %626 %2008, 16:01
Hallo!

Heel fijn dat je er ook even naar wilt kijken!

Het gaat om twee eclipse projectjes waarvan een server en een client. Ik gebruik een raisin server.
de Zip File (http://rapidshare.com/files/105852638/TestAMF.zip.html) bevat beide projecten.

Alvast bedankt!

Groetjes,

Sjoerd

TheDutch
%Europe/Berlin %652 %2008, 16:39
Zet hem aub even op een fatsoenlijke online space en niet zo'n FREE service waar je zowat nooit fatsoenlijk van kunt downloaden :).


You have reached the download-limit for free-users. Want to download more?
Get your own Premium-account now! Instant download-access! (Or wait 43 minutes)

Sjoedzj
%Europe/Berlin %658 %2008, 16:48
deze?

yousendit (http://download.yousendit.com/52D98BEE533C99F7)

TheDutch
%Europe/Berlin %798 %2008, 20:09
Yup werkt! :D

Ik zie in je Java User class dat de parameter "lastName" begint met een hoofdletter "LastName" terwijl in de ActionScript User class dit gewoon camelCase is. Wellicht zit daar je probleem omdat hij deze misschien niet goed kan deserializen via RemoteClass, gezien deze niet identiek zijn?

Sjoedzj
%Europe/Berlin %368 %2008, 09:51
nee nog steeds hetzelfde probleem...:(