2016-11-21 69 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