2010-02-04 17 views
6

Giả sử tôi có các lớp sauMapping tính sâu sắc với bộ sưu tập trung trong dozer

public class Baz { 
    private List<Foo> foos = new ArrayList<Foo>(); 
} 

public class Foo { 
    private String string; 
} 

public class Target { 
    private List<String> fooStrings = new ArrayList<String>(); 
} 

Có bản đồ tôi có thể sử dụng để, cho một Baz, bản đồ nó vào lớp mục tiêu và có được một danh sách các chuỗi chứa trong foo ở Baz? Ánh xạ sau đây không hoạt động

<mapping> 
    <class-a>Baz</class-a> 
    <class-b>Target</class-b> 
    <field> 
    <a>foos.string</a> 
    <b>fooStrings</b> 
    </field> 
</mapping> 

Vì chuỗi không phải là tài sản của sở thích (danh sách kiểu). Tôi đã nghĩ Dozer sẽ đủ thông minh để, nếu nó gặp phải một bộ sưu tập trong một bản đồ sâu, và mục tiêu cũng là một bộ sưu tập, để có thể phá vỡ tên thuộc tính sâu thành hai và lặp qua bộ sưu tập để có được phần con lập bản đồ sâu từ các thành viên thu thập. Rõ ràng là không. Có một giải pháp ngắn làm cho một yêu cầu tính năng của Dozer?

+0

như thế nào câu hỏi của tôi một sự trùng lặp của một câu hỏi hỏi 3 năm sau tôi? – Jherico

+0

Có thể được nhân đôi bởi [Dozer deep mapping Set để đặt ] (http://stackoverflow.com/questions/14212708/dozer-deep-mapping-setcomplexobject-to-setstring). @ Jherico Tôi xin lỗi vì sự nhầm lẫn. Stackoverflow chỉ cho phép đánh dấu bài đăng là trùng lặp nếu người khác chứa câu trả lời được chấp nhận. – rafalmag

Trả lời

1

Bạn luôn có thể viết CustomConverter của riêng mình. Nó có lý do tại sao Dozer không thể xử lý điều này như bạn mong đợi kể từ khi chạy nó không có thông tin loại về List foos và không thể đảm bảo rằng mọi Object trong danh sách thực sự là một Foo.

+1

Công việc không phải dozer của nó để đảm bảo rằng mọi mục trong Danh sách thực sự là một Foo. Trong thực tế nó thậm chí không phải quan tâm về điều đó. Tất cả nó cần phải biết rằng các thành viên của danh sách có một 'chuỗi' thuộc tính, và tùy thuộc vào tôi, nhà phát triển để đảm bảo luôn luôn như vậy. Viết trình chuyển đổi tùy chỉnh cho phiên bản Dozer cũ hơn là những gì tôi đã làm. tôi đã hy vọng trong 2 phiên bản chính của Dozer một người nào đó đã giải quyết trường hợp sử dụng khá rõ ràng (IMHO) này. – Jherico

0

Tôi nghĩ bạn có thể làm điều đó mà không cần trình chuyển đổi tùy chỉnh.

Override phương thức toString() của lớp Foo như dưới đây:

@Override 
public String toString(){ 
return this.getString(); //assuming string property has a getter method. if not,write this.string 

Và bây giờ các bản đồ follwing:

<mapping> 
<class-a>fully qualified name of Baz(with package name)</class-a> 
<class-b>same for Target</class-b> 
<field> 
    <a>foos</a> 
    <b>fooStrings</b> 
    <a-hint>foo</a-hint> 
    <b-hint>java.lang.String</b-hint> 
</field> 
</mapping> 
+1

Đó là một giải pháp rất chung chung. Nó chỉ cho phép bạn chọn một thuộc tính duy nhất cho mỗi lớp * phân cấp * để làm điều này và giết chết hàm toString() hiện có, thường có giá trị khá lớn để gỡ lỗi. – Jherico

1

Tôi nghĩ rằng, bạn có thể viết một bản đồ như vậy

<mapping> 
    <class-a>Baz</class-a> 
    <class-b>Target</class-b> 
    <field> 
    <a>foos</a> 
    <b>fooStrings</b> 
    </field> 
</mapping> 

<custom-converters> 
    <converter type="CustomFooConverter"> 
    <class-a> 
     Foo 
    </class-a> 
    <class-b> 
     String 
    </class-b> 
    </converter> 
</custom-converters> 

Và triển khai CustomFooConverter để lấy trường chuỗi của foo và trả về chuỗi dưới dạng Chuỗi.

Tôi nghĩ bạn có thể gửi một yêu cầu tính năng để hỗ trợ bản đồ để nguyên thủy như

<mapping> 
    <class-a>Foo</class-a> 
    <class-b>String</class-b> 
    <field> 
    <a>string</a> 
    </field> 
</mapping> 

vào Dozer GitHub

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