2017-11-08 8 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 

長い記事については申し訳ありません。 List <>内のマップフィールドをもう一度別のリスト<>に入れようとしていますか?何が最善のアプローチですか、私はここで何か間違っていますか?

答えて

0

両側のフィールド名が等しい場合は、フィールドマッピングを登録する必要はありません.Orkaはこれを自動的に処理します。また

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()); 
     } 
    } 
このコードは、正しくマッピングを行います
関連する問題