2012-11-16 124 views
1

我有一個要求將具有嵌套對象(深)的對象的屬性映射到DTO對象。其實我想用簡單的DTO將複雜的對象賦予甚至嵌套對象的所有屬性。 我試過BeanUtils,但也沒有做深拷貝。所以我正在探索Dozer來實施解決方案。 但即使Dozer正在映射第一級屬性,但不是深層嵌套對象屬性。如何使用Dozer做深層(或嵌套)對象屬性的映射?

這裏是我的課:

public class Child1 { 
    private String name = "MyName"; 
    private String address = "ABC"; 

    public TestDTO dto = new TestDTO("50", "USA"); 

    public TestDTO getDto() { 
     return dto; 
    } 

    public void setDto(TestDTO dto) { 
     this.dto = dto; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getAddress() { 
     return address; 
    } 
    public void setAddress(String address) { 
     this.address = address; 
    } 
} 


    public class TestDTO { 

    public TestDTO(){} 

    public TestDTO(String age, String country) { 
     super(); 
     this.age = age; 
     this.country = country; 
    } 

    private String age = "27"; 

    private String country = "Canada"; 

    public String getAge() { 
     return age; 
    } 

    public void setAge(String age) { 
     this.age = age; 
    } 

    public String getCountry() { 
     return country; 
    } 

    public void setCountry(String country) { 
     this.country = country; 
    } 

} 

這就是我想要做的緊縮所有TE屬性(甚至嵌套對象TestDTO目標:

public class TestFacade { 

    public String name ; 
    public String address; 
    private String age ; 
    private String country ; 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getAddress() { 
     return address; 
    } 
    public void setAddress(String address) { 
     this.address = address; 
    } 
    public String getAge() { 
     return age; 
    } 
    public void setAge(String age) { 
     this.age = age; 
    } 
    public String getCountry() { 
     return country; 
    } 
    public void setCountry(String country) { 
     this.country = country; 
    } 


} 

我的映射文件(我試過機智沒有配置文件也但它沒有工作,所以我添加了映射文件:

<?xml version="1.0" encoding="UTF-8"?> 

<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://dozer.sourceforge.net http://dozer.sourceforge.net/schema/beanmapping.xsd"> 

    <mapping> 
    <class-a>Child1</class-a> 
    <class-b>TestFacade</class-b> 
</mapping> 
<mapping> 
    <class-a>TestDTO</class-a> 
    <class-b>TestFacade</class-b> 
    <field> 
     <a is-accessible="true">country</a> 
     <b is-accessible="true">country</b> 
    </field> 
    <field> 
     <a>age</a> 
     <b is-accessible="true">age</b> 
    </field> 
</mapping> 

最後我的測試文件:

public class QuickTest { 


    public static void main(String[] args) { 
     Child1 ch = new Child1(); 
     System.out.println("Get" + ch.getDto().getCountry()); 


     List myMappingFiles = new ArrayList(); 
     myMappingFiles.add("dozerMapping.xml"); 
     DozerBeanMapper mapper = new DozerBeanMapper(myMappingFiles); 
     TestFacade f = mapper.map(ch, TestFacade.class); 
     System.out.println(ToStringBuilder.reflectionToString(f)); 

    } 

} 

這裏是輸出:

[email protected][name=MyName,address=ABC,age=<null>,country=<null>] 

從嵌套對象年齡和國家的性質不是映射?

回答

1

我自己找到了解決方案...

我的映射文件的內容是錯誤的。我應該使用「。」嵌套對象的表示法。

映射文件,以便正確的內容:

<mapping> 
<class-a>Child1</class-a> 
<class-b>TestFacade</class-b> 
</mapping> 
<mapping> 
<class-a>TestDTO</class-a> 
<class-b>TestFacade</class-b> 
<field> 
    <a>dto.country</a> 
    <b>country</b> 
</field> 
<field> 
    <a>dto.age</a> 
    <b >age</b> 
</field> 

output : 

[email protected][name=MyName,address=ABC,age=50,country=USA] 
+0

這是一個不正確的答案。請參考我的答案 – Bhuvan

2

接受的答案是不正確。這裏是正確的答案

<mapping> 
    <class-a>Child1</class-a> 
    <class-b>TestFacade</class-b> 
    <field> 
     <a>dto.country</a> 
     <b>country</b> 
    </field> 
    <field> 
     <a>dto.age</a> 
     <b>age</b> 
    </field> 
</mapping> 
相關問題