2009-11-18 30 views
6

Tôi đã tiếp xúc với bean Spring cho ứng dụng Flex của mình thông qua BlazeDS. Trong mã Java của tôi, tôi trả về các danh sách được đánh máy mạnh mẽ. ví dụ.Tôi làm cách nào để có được bộ sưu tập được đánh máy mạnh mẽ từ BlazeDS?

public List<Folder> getFolders(String path) { 
    return dao.getFolders(path); 
} 

Ứng dụng Flex nhận dữ liệu dưới dạng ArrayCollection of AS3 Các cá thể đối tượng - nghĩa là không phải là ArrayCollection của Thư mục mà tôi muốn. Tôi đã chú thích lớp Flex của mình như sau:

package myproject.vo { 
    import com.adobe.cairngorm.vo.IValueObject; 
    import mx.collections.ArrayCollection; 

    [Bindable] 
    [RemoteClass(alias="myproject.vo.Folder")] 
    public class Folder extends PersistentObject implements IValueObject { 
     public function Folder() {} 
    } 
} 

Tôi đã kiểm tra rằng tôi có getters/setters trên lớp Java Folder để khớp với các thuộc tính trong lớp Thư mục Flex của tôi. Bất kỳ ý tưởng?

+0

Tôi đã định dạng mã của bạn để các generics không được coi là HTML. –

Trả lời

11

Cuối cùng tôi đã giải quyết vấn đề này sau một chút Googling. Dưới đây là các quy tắc của tính năng từ chối Flex mà tôi đã tìm thấy:

  1. Chú thích đối tượng giá trị Flex để biểu thị lớp Java có liên quan. Điều này là cần thiết nếu tên gói khác nhau. - ví dụ. [Bindable] [RemoteClass (alias = ”package.JavaClass”)] lớp công khai FlexClass {}

  2. Các hàm tạo phải khớp với các đối tượng giá trị Flex và Java. Tôi đã kết thúc với các nhà thầu công lập không-args để giữ cho nó đơn giản.

  3. Getters and setters PHẢI khớp giữa các đối tượng giá trị Flex và Java.

  4. Quy tắc cuối cùng là trình bẻ khóa - Bạn PHẢI khởi tạo bất kỳ lớp nào mà bạn cần deserialize. Tuy nhiên, tôi đã dành nhiều ngày để cố gắng deserialize kết quả của một cuộc gọi getObjectsAtPath() từ xa - một danh sách PersistentObjects chứa các cá thể của Folder và Document (cả hai đều là các lớp con của PersistentObject). Nếu bạn không khởi tạo lớp một cách rõ ràng (trong trường hợp của tôi là lớp Thư mục) thì nó KHÔNG được đưa vào tệp SWF (không giống Java)! Cuối cùng tôi tạo ra một biến giả của Folder loại để có được điều này.

Cảm ơn mọi người đã đề xuất của bạn.

+0

Không thể nhấn mạnh đủ số 4. Nếu bạn muốn chuyển một ArrayCollection của Foo từ Flex-> Java, bạn phải làm điều gì đó dọc theo các dòng của arrayCollection.addItem (obj as Foo); –

+0

Liên quan đến # 4, bạn có thể lừa trình biên dịch nghĩ rằng bạn đang khởi tạo các đối tượng giả bằng cách đặt chúng trong khối "if (0) {...}". Đừng thử "if (false) {...}", có vẻ như trình biên dịch đủ thông minh để tìm ra rằng mã không bao giờ được thực thi. – Rydell

+0

Bạn thưa bạn, là chính xác. Tôi không thể đoán được bao nhiêu giờ bạn đã cứu tôi. Bạn có thể chia sẻ liên kết cho nơi bạn tìm thấy số 4 không? – Stephano

0

Tôi nhìn vào tất cả các mã server-side của tôi, và tôi không thể nhớ nếu điều này là cần thiết hay không, nhưng ở phía bên Java, Tôi tuyên bố các giá trị trở lại danh sách như mạnh mẽ-gõ:

public List<Folder> getFolders(String path) { 
    return dao.getFolders(path); 
} 
+0

tôi - trông giống như các dấu ngoặc nhọn của tôi bị tước đi. – ukdavo

+0

Các dấu ngoặc nhọn, còn gọi là Generics, bị tước thời gian biên dịch. –

+0

Tôi có nghĩa là bị loại bỏ bởi trình soạn thảo văn bản StackOverflow. Hoặc đó hoặc tôi bỏ qua sau đó khi gõ lên câu hỏi. Tôi luôn luôn sử dụng Generics để mạnh mẽ loại danh sách trong Java. – ukdavo

0

Generics Java bị loại bỏ lúc biên dịch. JVM không loại các bộ sưu tập tại thời gian chạy. Dù sao, tôi không thấy mã gọi của bạn, nhưng nó phải được đặt giá trị trả về từ java vào một biến được khai báo kinda như thế này:

folders:ArrayCollection.<String> 
0

Bạn mentionned rằng lớp thư mục của bạn rất phức tạp; nó có nghĩa là nó có chứa các tham chiếu đến các đối tượng khác không? Trong trường hợp này, bạn không phải ánh xạ mọi lớp khác (và kiểm tra các bộ định cư/getters, đặc biệt là cho boolean)?

+0

vâng - tôi đã làm điều đó. tôi sẽ kiểm tra lại. cảm ơn. – ukdavo

Các vấn đề liên quan