2012-06-19 30 views
9

tôi có một loạt các lớp Java của bên thứ ba sử dụng tên thuộc tính khác nhau cho những gì cơ bản đều giống nhau bất động sản:Canonicalizing Java tên thuộc tính đậu

public class Foo { 
    public String getReferenceID(); 
    public void setReferenceID(String id); 
    public String getFilename(); 
    public void setFilename(String fileName); 
} 

public class Bar { 
    public String getRefID(); 
    public void setRefID(String id); 
    public String getFileName(); 
    public void setFileName(String fileName); 
} 

Tôi muốn để có thể giải quyết vấn đề này trong một hình thức canonicalized, vì vậy mà tôi có thể đối xử với họ polymorphically, và vì vậy mà tôi có thể làm mọi thứ với Apache BeanUtils thích:

PropertyUtils.copyProperties(object1,object2); 

rõ ràng nó sẽ là tầm thường để viết một adapter cho mỗi lớp ...

public class CanonicalizedBar implements CanonicalizedBazBean { 
    public String getReferenceID() { 
     return this.delegate.getRefID(); 
    } 
    // etc. 
} 

Nhưng tôi tự hỏi có điều gì đó ở đó tổng quát hơn và năng động hơn không? Cái gì đó sẽ có một bản đồ một-nhiều bản tương đương tên thuộc tính, và một lớp đại biểu, và sản xuất Adapter?

Trả lời

6

Tôi chưa bao giờ sử dụng nó, nhưng tôi nghĩ rằng bạn đang tìm kiếm Dozer:

Dozer là một Java Bean để Java Bean mapper rằng đệ quy bản sao dữ liệu từ một đối tượng khác. Thông thường, các Hạt Java này sẽ là các loại phức tạp khác nhau.

Dozer hỗ trợ ánh xạ thuộc tính đơn giản, ánh xạ kiểu phức tạp, ánh xạ hai chiều, ánh xạ rõ ràng, cũng như ánh xạ đệ quy. Điều này bao gồm các thuộc tính thu thập ánh xạ mà cũng cần ánh xạ ở cấp phần tử.

Máy ủi không chỉ hỗ trợ ánh xạ giữa các tên thuộc tính, mà còn tự động chuyển đổi giữa các loại. Hầu hết các trường hợp chuyển đổi được hỗ trợ trong hộp, nhưng Dozer cũng cho phép bạn chỉ định các chuyển đổi tùy chỉnh qua XML.

+0

Cảm ơn. Dường như thực hiện công việc chính xác mà không có các giai đoạn trung gian không mong muốn. – slim

4
  1. Tùy chọn đầu tiên là Dozer.

  2. Tùy chọn thứ hai là Smooks Khung với một tinh chỉnh. Sẽ rất có ích khi sử dụng công cụ vẽ đồ họa của Smook.

  3. Tùy chọn khác sẽ là XStream với Công cụ lập bản đồ tùy chỉnh.

2

có lẽ một cái gì đó như thế:

public class CanonicalizedBar implements CanonicalizedBazBean { 
public String getReferenceID() { 
    Method m = this.delegate.getClass().getDeclaredMethod("getReferenceID"); 
    if(m == null) 
     m = this.delegate.getClass().getDeclaredMethod("getRefID"); 
    ... 
    return m.invoke(); 
} 
// etc. 
} 
2

Mặc dù, cá nhân tôi chưa bao giờ sử dụng nó. Tôi nhận thấy rằng một dự án được gọi là orika được ghi nhận là có hiệu suất tốt nhất và khả năng tự động hiểu nhiều ánh xạ như vậy. Ở mọi tốc độ, nó cũng hỗ trợ ánh xạ tùy chỉnh và sử dụng mã được tạo để xác định ngầm các bộ điều hợp. Bạn cũng có thể xác định người lập bản đồ tùy chỉnh, đó là nếu bạn biết cách viết hoa tên thành viên, bạn có thể sử dụng kiến ​​thức đó để xây dựng bản đồ đúng cho tất cả các đối tượng của bạn.ví dụ:

DefaultFieldMapper myDefaultMapper = new DefaultFieldMapper() { 
    public String suggestMapping(String propertyName, Type<?> fromPropertyType) { 
     // split word according to camel case (apache commons lang) 
     String[] words= StringUtils.splitByCharacterTypeCamelCase(propertyName); 
     if(words[0].length() > 6) { 
     // trim first camel-cased word of propery name to 3 letters 
     words[0]= words[0].substring(0,2); 
     return StringUtils.join(words); 
     } else { 
     // remains unchanged 
     return propertyName; 
     } 
    } 
} 

mapperFactory.registerDefaultFieldMapper(myDefaultMapper); 
1

Tôi chưa làm gì nhiều nhưng bạn có thể sử dụng Aspect Oriented Programming để thực hiện việc này.

Những gì bạn có thể làm tôi nghĩ là thêm phương thức vào từng lớp mà nội bộ gọi là phương thức thực. Xem điều này article khoảng một nửa xuống nó nói về mixin.

AspectJ có lẽ là triển khai phổ biến nhất.

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