2017-11-08 5 views
0

아래 예제를 고려하십시오.오리 카 매핑 중첩 된 하위 목록

Group.java (GroupDTO.java도 같은 특성을 갖는다)

import java.util.List; 

public class Group { 
    public Group(List<Person> persons) { 
     this.persons = persons; 
    } 

    private List<Person> persons; 

    public List<Person> getPersons() { 
     return persons; 
    } 

    public void setPersons(List<Person> persons) { 
     this.persons = persons; 
    } 
} 

Person.java (PersonDTO.java도 같은 특성을 갖는다)

import java.util.List; 

public class Person { 

    public Person(){} 
    public Person(List<Name> names, Integer age) { 
     this.names = names; 
     this.age = age; 
    } 

    private List<Name> names; 
    private Integer age; 

    public Integer getAge() { 
     return age; 
    } 

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

    public List<Name> getNames() { 
     return names; 
    } 

    public void setNames(List<Name> names) { 
     this.names = names; 
    } 
} 

Name.java (NameDTO. java는 동일한 속성을 가짐)

public class Name { 
    public Name(String first, String last) { 
     this.first = first; 
     this.last = last; 
    } 

    private String first; 
    private String last; 

    public String getFirst() { 
     return first; 
    } 

    public void setFirst(String first) { 
     this.first = first; 
    } 

    public String getLast() { 
     return last; 
    } 

    public void setLast(String last) { 
     this.last = last; 
    } 
} 

그리고 아래의 클래스를 실행할 때 다음 예외가 발생합니다.

import ma.glasnost.orika.MapperFacade; 
import ma.glasnost.orika.MapperFactory; 
import ma.glasnost.orika.impl.DefaultMapperFactory; 
import ma.glasnost.orika.metadata.ClassMapBuilder; 

import java.util.LinkedList; 
import java.util.List; 

public class Mapper { 

    public static void main(String[] args) { 

     List<Name> names = new LinkedList<Name>(); 
     names.add(new Name("foo", "bar")); 
     names.add(new Name("lorem", "ipsum")); 
     List<Person> persons = new LinkedList<Person>(); 
     persons.add(new Person(names, 30)); 
     persons.add(new Person(names, 40)); 
     Group g1 = new Group(persons); 

     MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build(); 
     ClassMapBuilder classMapBuilder = mapperFactory.classMap(Group.class, GroupDTO.class); 
     classMapBuilder.field("persons{age}", "persons{age}"); 
     classMapBuilder.field("persons{names{first}}", "persons{names{first}}"); 
     classMapBuilder.field("persons{names{last}}", "persons{names{last}}"); 
     classMapBuilder.byDefault().register(); 

     MapperFacade mapper = mapperFactory.getMapperFacade(); 
     GroupDTO groupDTO = mapper.map(g1, GroupDTO.class); 

     for(Person p:groupDTO.getPersons()){ 
      System.out.println(p.getAge()); 
      for(Name n:p.getNames()){ 
       System.out.println(n.getFirst()); 
       System.out.println(n.getFirst()); 
      } 
     } 

    } 
} 

예외

Exception in thread "main" ma.glasnost.orika.MappingException: java.lang.NullPointerException 
    at ma.glasnost.orika.impl.generator.MapperGenerator.build(MapperGenerator.java:104) 
    at ma.glasnost.orika.impl.DefaultMapperFactory.buildMapper(DefaultMapperFactory.java:1480) 
    at ma.glasnost.orika.impl.DefaultMapperFactory.build(DefaultMapperFactory.java:1295) 
    at ma.glasnost.orika.impl.DefaultMapperFactory.getMapperFacade(DefaultMapperFactory.java:883) 
    at Mapper.main(Mapper.java:28) 
Caused by: java.lang.NullPointerException 
    at ma.glasnost.orika.impl.generator.specification.MultiOccurrenceToMultiOccurrence.registerClassMaps(MultiOccurrenceToMultiOccurrence.java:397) 
    at ma.glasnost.orika.impl.generator.specification.MultiOccurrenceToMultiOccurrence.generateMappingCode(MultiOccurrenceToMultiOccurrence.java:72) 
    at ma.glasnost.orika.impl.generator.SourceCodeContext.mapAggregateFields(SourceCodeContext.java:721) 
    at ma.glasnost.orika.impl.generator.MapperGenerator.addMapMethod(MapperGenerator.java:182) 
    at ma.glasnost.orika.impl.generator.MapperGenerator.build(MapperGenerator.java:70) 
    ... 4 more 

긴 게시물에 대한 죄송합니다. 목록 <> 내부의지도 필드를 시도하고 있는데 또 다른 목록 <> 안에 있습니다. 최선의 접근 방법은 무엇입니까? 아니면 여기서 뭔가 잘못하고 있습니까?

답변

0

양쪽 필드 이름이 같으면 필드 매핑을 등록 할 필요가 없으므로 Orika가 직접 필드 매핑을 등록합니다. 또한

MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build(); 
    ClassMapBuilder classMapBuilder = mapperFactory.classMap(Group.class, GroupDTO.class); 
    classMapBuilder.byDefault().register(); 

    MapperFacade mapper = mapperFactory.getMapperFacade(); 
    GroupDTO groupDTO = mapper.map(g1, GroupDTO.class); 

, 아마 오타하지만 getNames()NameDTO에 대한 동일한 PersonDTO을 반환해야 GroupDTO에서 getPersons() : :

for(PersonDTO p:groupDTO.getPersons()){ 
     System.out.println(p.getAge()); 
     for(NameDTO n:p.getNames()){ 
      System.out.println(n.getFirst()); 
      System.out.println(n.getLast()); 
     } 
    } 
이 코드는 제대로 매핑을 할 것입니다