2016-11-21 73 views
0
public class Something{ 
    private string id; 
    private SomethingElse somethingElse; 
    private OtherProperties... 
} 
public class SomethingElse{ 
    private string id; 
    private OtherProperties... 
} 
public class SomethingDto{ 
    private string id; 
    private string somethingElseId; 
    private OtherProperties... 
} 

當映射從東西SomethingDto我要做推土機深物業映射

<mapping> 
    <class-a>Something</class-a> 
    <class-b>SomethingDto</class-b> 
    <field> 
     <a>somethingElse.id</a> 
     <b>somethingElse</b> 
    </field> 
</mapping> 

我不知道怎麼做相反的我要的是「新SomethingElse」,然後設置ID這樣

public class Something{ 
    private string id; 
    private SomethingElse somethingElse; 
    private OtherProperties... 
    public void setSomethingElseById(String somethingElseId){ 
     somethingElse = new SomethingElse; 
     somethingElse.setId(somethingElseId); 
    } 
} 
<mapping> 
    <class-a>SomethingDto</class-a> 
    <class-b>Something</class-b> 
    <field> 
     <a>somethingElse</a> 
     <b set-method='setSomethingElseById(SomethingElse)' >somethingElse</b> 
    </field> 
</mapping> 

這的確看起來像一個壞的解決方案,所以我嘗試定製轉換

public class SomethingDtoToSomethingConverter extends DozerConverter<String, SomethingElse> { 
    public SomethingDtoToSomethingConverter() { 
    super(String.class, SomethingElse.class); 
    } 
    @Override 
    public SomethingElse convertTo(String source, SomethingElse destination) { 
    destination = new SomethingElse(); 
    destination.setId(source); 
    return destination; 
    } 
    @Override 
    public String convertFrom(SomethingElse source, String destination) { 
    destination = source.getId(); 
    return destination ; 
    } 
} 

這看起來像一個非常簡單的代碼荒謬的數量 我該如何實現一個更清潔的解決方案?

回答

0

您使用的是什麼版本的推土機?這應該只使用您定義的第一個映射即可使用,Dozer映射默認爲雙向映射。

我已經創建基於與一個單元測試代碼能傳遞例如:

Something.java

public class Something { 
    private String id; 
    private SomethingElse somethingElse; 
    ... 
} 

SomethingElse.java

public class SomethingElse { 
    private String id; 
    ... 
} 

SomethingDto.java

public class SomethingDto { 
    private String id; 
    private String somethingElseId; 
    ... 
} 

dozer.xml

<mapping> 
    <class-a>Something</class-a> 
    <class-b>SomethingDto</class-b> 
    <field> 
     <a>somethingElse.id</a> 
     <b>somethingElseId</b> 
    </field> 
</mapping> 

單元測試

public class DozerMappingTest { 

    private DozerBeanMapper beanMapper; 

    @Test 
    public void sourceToDestination() { 
     List<String> mappingFiles = new ArrayList<String>(); 
     mappingFiles.add("dozer.xml"); 
     this.beanMapper = new DozerBeanMapper(mappingFiles); 

     Something source = new Something(); 
     source.setId("A"); 
     SomethingElse somethingElse = new SomethingElse(); 
     somethingElse.setId("B"); 
     source.setSomethingElse(somethingElse); 

     SomethingDto dest = beanMapper.map(source, SomethingDto.class); 
     assertEquals("A", dest.getId()); 
     assertEquals("B", dest.getSomethingElseId()); 
    } 

    @Test 
    public void destinationToSource() { 
     List<String> mappingFiles = new ArrayList<String>(); 
     mappingFiles.add("dozer.xml"); 
     this.beanMapper = new DozerBeanMapper(mappingFiles); 

     SomethingDto source = new SomethingDto(); 
     source.setId("A"); 
     source.setSomethingElseId("B"); 

     Something dest = beanMapper.map(source, Something.class); 
     assertEquals("A", dest.getId()); 
     assertEquals("B", dest.getSomethingElse().getId()); 
    } 
} 
+0

試過了,沒有出於某種原因...也許我失去了一些東西,做你有一個id域的構造函數或什麼?我只允許使用空的構造函數不幸 – Als

+0

這很奇怪,它對我來說工作得很好。我的Java bean只有默認的構造函數,並且單元測試執行得很好 –

+0

Ups,剛剛意識到我搞砸了(如同allways),它的工作原理就像你說的那樣 – Als