2010-12-07 7 views
0

にBlazeDSの上でオブジェクト私はちょうど私の問題を説明しよう:ArrayListのはすぐAS3.0

私は、次のJavaclassesを得たBlazeDSの使用:

DatabaseService.java:

public class Database { 

private Category helpCat = null; 


private Category root = new Category(1, "root", null, null); 
private List<Article> database; 


public Database() 
{  


    // ------------ tree ----------------------------------------------------------------------- 
    List<Category> level_one = new ArrayList<Category>(); 
    List<Category> level_two_computer = new ArrayList<Category>(); 
    List<Category> level_tree_hardware = new ArrayList<Category>(); 

    // Level 1 
    Category buecher = new Category(2, "buecher", root, null); 
    Category computer = new Category(3, "computer", root, level_two_computer); 
    level_one.add(buecher); 
    level_one.add(computer); 

    //Level 2 
    Category hardware = new Category(4, "hardware", computer, level_tree_hardware); 
    Category software = new Category(5, "software", computer, null); 
    level_two_computer.add(hardware); 
    level_two_computer.add(software); 

    //Level 3 
    Category graphic = new Category(6, "graphic", hardware, null); 
    Category sound = new Category(7, "sound", hardware, null); 
    level_tree_hardware.add(graphic); 
    level_tree_hardware.add(sound); 

    // Level 0 
    root.addChilds(level_one); 
    // ------ tree end ---------------------------------------------------------------------------- 

    database = new ArrayList<Article>(); 
    try { 
    add(new Book("Per Anhalter durch die Galaxis", "42", Articletype.BOOK, 795, "Per Anhalter durch die Galaxiss", "Douglas Adams", "Heyne Verlag", "Taschenbuch", "3453146972"), buecher); 
    add(new Book("Harry Potter und der Stein der Weisen", "descriptionShort", Articletype.BOOK, 1299, "Harry Potter und der Stein der Weisen", "Joanne K. Rowling", "Carlsen Verlag GmbH", "gebunden", "3551551677"), buecher); 
    add(new Book("Harry Potter und die Kammer des Schreckens", "descriptionShort", Articletype.BOOK, 1499, "Harry Potter und die Kammer des Schreckens", "Joanne K. Rowling", "Carlsen Verlag GmbH", "gebunden", "3551551677"), buecher); 
    add(new Hardware("nVidia GeForce 8400GS", "Graphikkarte", Articletype.HARDWARE, 2665, "512 GDDR5 Speicher, DVI, 1 GPU", "MSI", "neu"), graphic); 
    add(new AKW("Biblis C", "Druckwasserreaktor, Preis auf Anfrage, Nur Selbstabholer", Articletype.AKW, -1, "Biblis", 0, 2525, "Siemens", 1, 2012), software); 
    } catch (Exception e) { 

    e.printStackTrace(); 
    } 
} 

public List<Category> getCategories(String node) { 
    if(node.equalsIgnoreCase("root")) 
    return root.getChildren(); 

    Category baum = null; 
    baum = get_node_by_name(root, node); 

    return baum.getChildren(); 

} 

private Category get_node_by_name(Category localroot, String lookfor) 
{ 
    helpCat = null; 
    if(localroot.getChildren() != null) 
    { 
    for (int i = 0; i < localroot.getChildren().size(); ++i) 
    { 
    if(!(localroot.getChild(i).getName().equals(lookfor))) 
    { 
    get_node_by_name(localroot.getChild(i), lookfor); 
    } 
    else 
    { 
    helpCat = localroot.getChild(i); 
    helpCat.setParent(null); 
    } 
    } 
    } 
    return helpCat; 
} 

public List<Article> search(int artID, String name, Category categorie){ 
    List<Article> ergebnis = new ArrayList<Article>(); 
    if (artID >= 0) 
    { 
    for(int i = 0; i< database.size(); ++i){ 
    if(database.get(i).getID() == artID) 
    { 
    ergebnis.add(database.get(i)); 
    return ergebnis; 
    } 
    } 
    } 

    if (name != null){ 
    for(int i = 0; i<database.size(); ++i){ 
    if (database.get(i).getName().equalsIgnoreCase(name)) 
    ergebnis.add(database.get(i)); 
    } 
    return ergebnis; 
    } 
    if (categorie != null){ 
    { 
    ergebnis.addAll(categorie.getArticles()); 
    } 
    return ergebnis; 
    } 

    return database; 
} 


public Article add(Article newArticle, Category cat) throws Exception 
{ 
    newArticle.addCategory(cat); 
    if(newArticle.getID() != 0) 
    { 
    throw new Exception("Die Artikel ID wird vom DBS festgelegt!"); 
    } 

    if (database.isEmpty()) 
    { 
    newArticle.setID(0); 
    } 
    else 
    { 
    newArticle.setID(database.get(database.size() - 1).getID()+1); 
    } 

    database.add(newArticle); 

    return newArticle; 
} 

} 

カテゴリクラス:

public class Category { 
private int idCat; 
private String nameTEST; 
private Category parent = null; 
private List<Article> articles = new ArrayList<Article>(); 
private List<Category> children = new ArrayList<Category>(); 


public Category(int _id, String _name, Category _parent, List<Category> _children) 
{ 
    if(_id > 0) 
    idCat = _id; 
    if(_name != null) 
    nameTEST = _name; 
    if(_parent != null) 
    parent = _parent; 
    if(_children != null) 
    children = _children; 
} 

public String toString() 
{ 
    return nameTEST; 
} 

void addArticle(Article article){ 
    articles.add(article); 
} 

public List<Article> getAllArticles(){ 
    List<Article> ergebnis = this.getArticles(); 

    for (int i = 0; i<children.size();++i){ 
    ergebnis.addAll(children.get(i).getAllArticles()); 
    } 

    return ergebnis; 
} 

public void setID(int iD) { 
    idCat = iD; 
} 

public int getID() { 
    return idCat; 
} 

public void setName(String name) { 
    this.nameTEST = name; 
} 

public String getName() { 
    return nameTEST; 
} 

/** 
    * @param parent the parent to set 
    */ 
public void setParent(Category parent) 
{ 
    this.parent = parent; 
} 

/** 
    * @return the articles 
    */ 
public List<Article> getArticles() 
{ 
    return articles; 
} 

public void addChilds(List<Category> _next) 
{ 
    for (int i = 0; i < _next.size(); ++i) 
    { 
    children.add(_next.get(i)); 
    } 
} 

public void addChild(Category one_next) 
{ 
    children.add(one_next); 
} 

public Category getChild(int index) 
{ 
    return children.get(index); 
} 

public void removeChild(Article article){ 
    articles.remove(article); 
} 

public List<Category> getChildren() 
{ 
    return this.children; 
} 
} 

もちろん、articlのクラスもありますそれは重要なことではありません。

フレックスでの対応は次のようになります。

Category.as

[RemoteClass(alias="PACKAGE.Category")] 
public class Category 
{ 
    private var idCat:int  = -1; 
    private var nameTEST:String = null; 
    private var parent:Category = null; 
    private var articles:ArrayCollection = new ArrayCollection; 
    private var children:ArrayCollection = new ArrayCollection; 

    public function Category(id:int, name:String, parent:Category, childlist:ArrayCollection, articles:ArrayCollection = null) 
    { 
    this.idCat = id; 
    this.nameTEST = name; 
    this.parent = parent; 
    this.articles = articles; 
    this.children = childlist; 
    } 

    public function setChildren(childList:ArrayCollection):void 
    { 
    this.children = childList; 
    } 

    public function getChildren():ArrayCollection 
    { 
    return this.children; 
    } 

    public function getName():String 
    { 
    return this.nameTEST; 
    } 
} 

それから私は、BlazeDSのを呼び出し、getCategoriesのJavaメソッドを実行するFlexのサービスクラスを得ました。 Flashは型指定された配列を理解しているように見えるので、flexで返されるそのメソッドの結果は、型指定されていないオブジェクトの単純な配列です(マッピングのdosn'tはここで動作するようです。同じ特性)。 これが最初のことです。しかし、私はuntypedオブジェクトをcategory.asクラスのオブジェクトに手動で変換しています。

第2の事柄は、カテゴリがcategory.javaのArrayListsであるJavaオブジェクト内に子カテゴリを持つということです。それに関する問題:私の結果イベントオブジェクトには、カテゴリの最初のレベルしか含まれておらず、子どもが常にnullであることがわかります。なぜなら、それらはJavaオブジェクトカテゴリの一部であるからです。

と3番目のもの(高速で最も奇妙です)、idとnameの代わりにidCatとnameTestのような奇妙なcategory.javaクラスのプロパティに名前をつけたことに気づいたかもしれません。どうして?結果オブジェクトのプロパティは "id"と "name"ですが、javaクラスオブジェクトのプロパティの名前は "idCAT"と "nameTEST"です。 。あなたがnameTEST = "TESTNAME"で見るようにプロパティを設定すると、それはflexによって認識されるので、proertyNAMESは認識されないように見えるので、本当に奇妙です。

はどこかのマッピング設定を保存/キャッシュしていますか?もしそうなら、どうすれば穴のマッピングを再構築できますか?

これはまた、私がJavaから得る型付けされていないオブジェクトについての私の問題を説明することができました。リストをArrayListsに変更する前にベクトル(blazeDSはAFAIKをサポートしません)、そしてpropertynamesだけでなく、 propertytypesはいくつかの配線された場所でハード・マッピングされているだけで、それらはリフレッシュされません。

これまでに5回すべてをチェックしたことがありましたが、サーバ上のブレーズを再配置してマッピングが残っていないことを確認しましたが、まったく役に立たなかった。

私は何ができますか? (別のシリアライザに変わってから別のものに変わってしまいました(それ以外のものがすべて失敗したらどうするつもりか...))

+1

実例を示すことができれば、それを見てみることができます(完全なflex/javaプロジェクト)。 –

答えて

0

クラスネームの単純なミスマッチがすべての悪の原因でした。まだいくつかの問題を解決するが、少なくとも私はサブ配列が返され、オブジェクトはまだ単純なAS 3オブジェクトであり、指定された "Category"と "Article"オブジェクトではないが、そのためマッピングが失敗しています。

申し訳ありませんが、ありがとうございます。

+0

最後に解決しましたか? –

1

私は同じ問題を抱えていますが、メソッドを呼び出す前にツリーをウォームアップできればOKです。 何が起こっていなくても、あなたは作者のイライラです。それはなぜこの作品がうんざりです!

1

私は、リスト内の子要素を含まないサービスから返されたリストに同様の問題がありました。私は、BlazeDSが型付きリストを返すことができることを発見しました。

a)返されるリストの型がjava.util.List(java.util.ArrayList以外)であることを確認してください。

b)リスト内の要素のクラスには、すべてのエンティティが公開されるためのパブリックセッターとゲッターの両方が返されていることを確認してください。例えば

- 次のコードは、私の作品:

public class OrganisationService { 
    ... 
    public List<Organisation> getOrganisations() { 
     List<Organisation> list = new ArrayList<Organisation>(); 
     ... 
     return list; 
    } 
    ... 
} 
1

他の場所で述べたように、あなたはそれがコンパイル時にSWFに含まれるように、あなたのAS3リモートオブジェクトをinitiailizeする必要があります。どこかあなたのコード内

、追加:

のvar猫:カテゴリー=新しいカテゴリーを(); var art:Article = new Article();

これは、一般的なオブジェクトの問題を修正する必要があります。 (私はアプリケーションの起動方法で、私はすべてを1つの場所に追加します)。

+0

LazerWonderが私の問題も解決したと言われているもの。私は型なしのオブジェクトのリストを取得していました。私はすぐにフレックスのどこかでオブジェクトを使用しました - いくつかのランダムなinstatiation - それは働いた!歓声メイト! – kkudi