2016-11-21 7 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 я должен сделатьбульдозер Deep Property Mapping

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

Я не уверен, как это сделать наоборот, что я хочу, это «новый SomethingElse», а затем установить идентификатор как этот

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

Какую версию бульдозера вы используете? Это должно просто работать из коробки, используя первое сопоставление, которое вы определили как сопоставления Дозер, по умолчанию двунаправлены.

Я создал пример, основанный на коде с модульного тестирования, который проходит:

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> 

Unit Test

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-бобы просто имели конструкторы по умолчанию, и тестовый блок выполнялся отлично –

+0

Упс, только что понял, что я завинтил (как всегда), он работает так, как вы сказали – Als