ArrayList пользовательских объектов Java через BlazeDS в AS3.0 - PullRequest
0 голосов
/ 07 декабря 2010

Сразу же я просто пытаюсь объяснить мою проблему:

Используя BlazeDS, я получил следующие Javaclasses:

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;
 }
}

также, конечно, есть классы для статей и так далее, но это не важно в этот момент.

аналог в flex выглядит следующим образом:

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; 
  }
 }

Затем я получил класс обслуживания Flex, вызывающий BlazeDS и выполняющий Java-метод getCategories.Поскольку Flash, похоже, не понимает типизированные массивы, результатом этого метода, который я получаю обратно во flex, является простой массив нетипизированных объектов (кажется, что отображение здесь не работает, даже если учесть, что категория класса существует во flex и имеетте же свойства).это первое.но, тем не менее, я конвертирую нетипизированные объекты вручную в объекты класса category.as.

Во-вторых, у категорий есть дочерние категории в объекте java, которые также являются ArrayLists категории типа.Джава.проблема в том, что мой объект события результата содержит только первый уровень категорий, при этом дети всегда равны нулю.Я не знаю, почему они пусты, так как они являются частью категории объектов Java.

и третье (самый странный по быстродействию), вы, возможно, заметили, что я назвал свойства класса category.java странными, например:idCat и nameTest вместо просто id и name.Почему так?потому что имена свойств моих гибких объектов-результатов не меняются, когда я изменяю имена свойств объектов Java (свойства объекта-результата называются «id» и «name», а свойства объекта класса java - «idCAT» и «nameTEST»),что это ДЕЙСТВИТЕЛЬНО странно, так как, если я устанавливаю свойства, как вы видите в nameTEST = "TESTNAME", он распознается flex, кажется, что только proertyNAMES вообще не распознаются.

- это сохранение / кэширование Blaze DSконфигурация сопоставления где-нибудь?как мне получить его, чтобы перестроить отображения дырок, если это так?

, что также может объяснить мою проблему с нетипизированными объектами, которые я получаю из java, так как до того, как я изменил списки на ArrayLists они были векторами (которые blazeDS досне поддерживает AFAIK), и, возможно, не только имена свойств, но и типы свойств жестко сопоставляются в каком-то проводном месте, а блэйды просто не обновляют их.

мне действительно нравится проверять все 5 раз к настоящему времени,даже перераспределил блейд-серверы на сервере, чтобы убедиться, что сопоставления не осталось, но это не помогло вообще.

ЛЮБЫЕ идеи, что я мог сделать?(кроме перехода на другой сериализатор, а затем проклятый (вот что я собираюсь сделать, если все остальное не получится ...))

Ответы [ 4 ]

1 голос
/ 17 марта 2011

Как уже упоминалось, вам нужно инициализировать удаленные объекты AS3, чтобы они были включены в SWF-файл во время компиляции.

Где-то в вашем коде добавьте:

var cat: Category = new Category (); var art: Article = new Article ();

Это должно исправить вашу проблему с общим объектом. (Я добавляю свои все в одном месте, в методе запуска приложения).

1 голос
/ 19 января 2011

У меня такие же проблемы, но если вы можете прогреть дерево перед вызовом метода, все будет в порядке.что я имею в виду "разминка", так это то, что вы итератор массива, ничего не делаяпочему это работает!

1 голос
/ 21 января 2011

У меня были похожие проблемы со списком, возвращенным из службы, не включающей дочерние элементы в список. Я обнаружил, что BlazeDS может вернуть типизированный список. Две вещи, которые исправили это для меня:

a) Убедитесь, что возвращаемый список имеет тип java.util.List (например, не java.util.ArrayList).

b) Убедитесь, что класс для элементов в списке имеет как общедоступные установщики, так и получатели для всех сущностей, которые должны быть возвращены.

Например - у меня работает следующий код:

public class OrganisationService {
    ...
    public List<Organisation> getOrganisations() {
        List<Organisation> list = new ArrayList<Organisation>();
        ...
        return list;
    }
    ...
}
0 голосов
/ 09 декабря 2010

Оказывается, простое несоответствие названий классов стало причиной всего зла. все еще есть некоторые проблемы, которые нужно решить, но, по крайней мере, я теперь получаю подмассивы, только объекты все еще являются простыми объектами AS 3, а не указанными объектами "Category" и "Article", но я думаю, это потому, что у меня не все методы включены из-за этого происходит сбой картирования.

но спасибо за ваше предложение, я ценю это.

...