2015-11-03 17 views
13

Tôi hiện đang sử dụng Dozer để ánh xạ đối tượng Entity cho các đối tượng Dto trong dự án của tôi.Dozer: Làm thế nào để hạn chế độ sâu của ánh xạ?

Câu hỏi của tôi là cách giới hạn mức độ hoặc độ sâu của ánh xạ nội bộ?

Ví dụ: Tôi có một thực thể AccountProfile có pháp nhân List<AccountProfileDetail> làm thành viên. Ngoài ra, AccountProfileDetail có một thực thể FinancialTransLimit với tư cách là thành viên.

Bây giờ tôi muốn nói cho người lập bản đồ biết, ví dụ như chỉ ánh xạ với depth = 2. Vì vậy, thành viên FinancialTransLimit không được sao chép vào thành viên AccountProfileDetail của đối tượng đích.

Tôi cần chỉ định độ sâu sử dụng API lập trình không có trong xml. Tuy nhiên, tôi cũng không tìm thấy nó trong cấu hình xml.

Tôi đã thử Orika cũng vậy, nhưng tôi cũng không thể tìm thấy tính năng này trong Orika!

Cả hai mã sau đây (để thử nghiệm với Dozer và Orika là một giải pháp thay thế) hoạt động tốt và làm một bản sao sâu. Tôi cần giới hạn độ sâu cho ít nhất một trong số chúng.

Có ai giúp tôi với điều này không?

Rất cám ơn!

Sample Code:

AccountProfile

//My Entities: 
import java.util.List; 

public class AccountProfile{ 

    private Long id; 
    private String name; 
    private List<AccountProfileDetail> accountProfileDetails; 

    public AccountProfile() { 
    } 

    public Long getId() { 
     return this.id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return this.name; 
    } 

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

    public List<AccountProfileDetail> getAccountProfileDetails() { 
     return this.accountProfileDetails; 
    } 

    public void setAccountProfileDetails(List<AccountProfileDetail> accountProfileDetails) { 
     this.accountProfileDetails = accountProfileDetails; 
    } 
} 

AccountProfileDetail

import java.math.BigDecimal; 

public class AccountProfileDetail { 

    private Long id; 
    private BigDecimal accountMinBalance; 
    private AccountProfile accountProfile; 
    private FinancialTransLimit financialTransLimit; 

    public AccountProfileDetail() { 
    } 

    public Long getId() { 
     return this.id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public BigDecimal getAccountMinBalance() { 
     return this.accountMinBalance; 
    } 

    public void setAccountMinBalance(BigDecimal accountMinBalance) { 
     this.accountMinBalance = accountMinBalance; 
    } 

    public AccountProfile getAccountProfile() { 
     return this.accountProfile; 
    } 

    public void setAccountProfile(AccountProfile accountProfile) { 
     this.accountProfile = accountProfile; 
    } 

    public FinancialTransLimit getFinancialTransLimit() { 
     return this.financialTransLimit; 
    } 

    public void setFinancialTransLimit(FinancialTransLimit financialTransLimit) { 
     this.financialTransLimit = financialTransLimit; 
    } 
} 

FinancialTransLimit

public class FinancialTransLimit{ 

    private Long id; 
    private String limitCode; 

    public FinancialTransLimit() { 
    } 

    public Long getId() { 
     return this.id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getLimitCode() { 
     return this.limitCode; 
    } 

    public void setLimitCode(String limitCode) { 
     this.limitCode = limitCode; 
    } 
} 

AccountProfileDto

// My Dtos: 
import java.util.List; 

public class AccountProfileDto{ 
    private Long id; 
    private String name; 
    private List<AccountProfileDetailDto> accountProfileDetails; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

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


    public List<AccountProfileDetailDto> getAccountProfileDetails() { 
     return accountProfileDetails; 
    } 

    public void setAccountProfileDetails(List<AccountProfileDetailDto> accountProfileDetails) { 
     this.accountProfileDetails = accountProfileDetails; 
    } 
} 

AccountProfileDetailDto

import java.math.BigDecimal; 

public class AccountProfileDetailDto { 

    private Long id; 
    private BigDecimal accountMinBalance; 
    private AccountProfileDto accountProfile; 
    private FinancialTransLimitDto financialTransLimit; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public BigDecimal getAccountMinBalance() { 
     return accountMinBalance; 
    } 

    public void setAccountMinBalance(BigDecimal accountMinBalance) { 
     this.accountMinBalance = accountMinBalance; 
    } 

    public AccountProfileDto getAccountProfile() { 
     return accountProfile; 
    } 

    public void setAccountProfile(AccountProfileDto accountProfile) { 
     this.accountProfile = accountProfile; 
    } 

    public FinancialTransLimitDto getFinancialTransLimit() { 
     return financialTransLimit; 
    } 

    public void setFinancialTransLimit(FinancialTransLimitDto financialTransLimit) { 
     this.financialTransLimit = financialTransLimit; 
    } 
} 

FinancialTransLimitDto

public class FinancialTransLimitDto { 
    private Long id; 
    private String limitCode; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getLimitCode() { 
     return limitCode; 
    } 

    public void setLimitCode(String limitCode) { 
     this.limitCode = limitCode; 
    } 
} 

Và bây giờ mã test với Dozer: Mã

import java.math.BigDecimal; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

import org.dozer.DozerBeanMapper; 
import org.dozer.Mapper; 


public class TestDozer { 

    public static void main(String[] args) { 

     List<AccountProfile> profiles = createList(); 

     Mapper mapper = new DozerBeanMapper(); 

     List<AccountProfileDto> profileDtos = new ArrayList<AccountProfileDto>(); 

     for (AccountProfile entity: profiles) { 
      AccountProfileDto dto = new AccountProfileDto(); 
      mapper.map(entity, dto); 
      profileDtos.add(dto); 
     } 

     System.out.println(Arrays.deepToString(profileDtos.toArray())); 
    } 

    private static List<AccountProfile> createList(){ 
     List<AccountProfile> accountProfiles = new ArrayList<AccountProfile>(); 

     AccountProfile ap1 = new AccountProfile(); 
     ap1.setId(new Long(1000)); 
     ap1.setName("profile1"); 

     FinancialTransLimit ftlt1 = new FinancialTransLimit(); 
     ftlt1.setId(new Long(3000)); 
     ftlt1.setLimitCode("L1"); 

     AccountProfileDetail apd1 = new AccountProfileDetail(); 
     apd1.setId(new Long(2000)); 
     apd1.setAccountProfile(ap1); 
     apd1.setAccountMinBalance(new BigDecimal(100000)); 
     apd1.setFinancialTransLimit(ftlt1); 

     List<AccountProfileDetail> apds1 = new ArrayList<AccountProfileDetail>(); 
     apds1.add(apd1); 
     ap1.setAccountProfileDetails(apds1); 

     accountProfiles.add(ap1); 
     // 
     AccountProfile ap2 = new AccountProfile(); 
     ap2.setId(new Long(1001)); 
     ap2.setName("profile2"); 

     FinancialTransLimit ftlt2 = new FinancialTransLimit(); 
     ftlt2.setId(new Long(3001)); 
     ftlt2.setLimitCode("L2"); 

     AccountProfileDetail apd2 = new AccountProfileDetail(); 
     apd2.setId(new Long(2001)); 
     apd2.setAccountProfile(ap2); 
     apd2.setAccountMinBalance(new BigDecimal(200000)); 
     apd2.setFinancialTransLimit(ftlt2); 

     List<AccountProfileDetail> apds2 = new ArrayList<AccountProfileDetail>(); 
     apds2.add(apd2); 
     ap2.setAccountProfileDetails(apds2); 

     accountProfiles.add(ap2); 
     // 
     return accountProfiles; 
    } 
} 

Thử nghiệm với Orika:

import java.math.BigDecimal; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

import ma.glasnost.orika.BoundMapperFacade; 
import ma.glasnost.orika.MapperFactory; 
import ma.glasnost.orika.impl.DefaultMapperFactory; 

public class TestOrika { 

    public static void main(String[] args) { 

     List<AccountProfile> profiles = createList(); 

     MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build(); 
     BoundMapperFacade<AccountProfile, AccountProfileDto> mapper = mapperFactory.getMapperFacade(AccountProfile.class, AccountProfileDto.class); 

     List<AccountProfileDto> profileDtos = new ArrayList<AccountProfileDto>(); 

     for (AccountProfile entity: profiles) { 
      AccountProfileDto dto = new AccountProfileDto(); 
      mapper.map(entity, dto); 
      profileDtos.add(dto); 
     } 

     System.out.println(Arrays.deepToString(profileDtos.toArray())); 
    } 

    private static List<AccountProfile> createList(){ 
     List<AccountProfile> accountProfiles = new ArrayList<AccountProfile>(); 

     AccountProfile ap1 = new AccountProfile(); 
     ap1.setId(new Long(1000)); 
     ap1.setName("profile1"); 

     FinancialTransLimit ftlt1 = new FinancialTransLimit(); 
     ftlt1.setId(new Long(3000)); 
     ftlt1.setLimitCode("L1"); 

     AccountProfileDetail apd1 = new AccountProfileDetail(); 
     apd1.setId(new Long(2000)); 
     apd1.setAccountProfile(ap1); 
     apd1.setAccountMinBalance(new BigDecimal(100000)); 
     apd1.setFinancialTransLimit(ftlt1); 

     List<AccountProfileDetail> apds1 = new ArrayList<AccountProfileDetail>(); 
     apds1.add(apd1); 
     ap1.setAccountProfileDetails(apds1); 

     accountProfiles.add(ap1); 

     // 

     AccountProfile ap2 = new AccountProfile(); 
     ap2.setId(new Long(1001)); 
     ap2.setName("profile2"); 

     FinancialTransLimit ftlt2 = new FinancialTransLimit(); 
     ftlt2.setId(new Long(3001)); 
     ftlt2.setLimitCode("L2"); 

     AccountProfileDetail apd2 = new AccountProfileDetail(); 
     apd2.setId(new Long(2001)); 
     apd2.setAccountProfile(ap2); 
     apd2.setAccountMinBalance(new BigDecimal(200000)); 
     apd2.setFinancialTransLimit(ftlt2); 

     List<AccountProfileDetail> apds2 = new ArrayList<AccountProfileDetail>(); 
     apds2.add(apd2); 
     ap2.setAccountProfileDetails(apds2); 

     accountProfiles.add(ap2); 

     // 

     return accountProfiles; 
    } 
} 
+0

Bạn có một số mã để chia sẻ không? – cheffe

+0

@cheffe: Tôi sẽ chia sẻ mẫu mã của tôi vào ngày mai. – STaefi

+1

@cheffe: Tôi đã thêm một số mã. – STaefi

Trả lời

2

Tôi không nghĩ rằng đó là nơi cư trú của phiên bản cuối cùng tôi đã sử dụng (5.5.X). Dozer sẽ cố gắng để ánh xạ các đối tượng từ một đến một cho đến khi anh ta kết thúc. Nếu anh ta tìm thấy một mối quan hệ tròn, nó sẽ ném một ngoại lệ. Ngoài ra, ngoại lệ sẽ được ném nếu hai đối tượng có thuộc tính của các loại khác nhau có tên giống nhau.Đó là toàn bộ quan điểm của việc sử dụng thư viện người lập bản đồ bên thứ 3. Tuy nhiên, nếu đối tượng đích không chứa thuộc tính có thể được sử dụng trong khi ánh xạ nguồn, thuộc tính đó sẽ bị bỏ qua. Tương tự về mặt lý thuyết, nếu bạn đặt tên cho các thuộc tính đích khác nhau. Bạn có thể làm việc ra một số hacks bằng cách sử dụng các quy tắc này.

Tôi khuyên bạn chỉ nên gắn với Dozer nếu bạn có 1 đến 1 ánh xạ mà không có sự khác biệt về nguồn và đối tượng mục tiêu. Nếu bạn có sự khác biệt hoặc hạn chế về cách bạn muốn ánh xạ nó, hãy viết trình chuyển đổi của riêng bạn.

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