【问题标题】:Orika mapping nested sublistOrika 映射嵌套子列表
【发布时间】:2018-04-21 18:58:05
【问题描述】:

考虑下面的例子。

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 内部映射字段,这又在另一个 List 内部。最好的方法是什么,或者我在这里做错了什么?

【问题讨论】:

    标签: java mapping orika


    【解决方案1】:

    如果两边的字段名称相同,则不必注册字段映射,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);
    

    另外,可能只是一个错字,但来自GroupDTOgetPersons() 应该返回PersonDTO,同样适用于getNames()NameDTO

       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());
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2016-08-21
      • 2015-02-07
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 2020-04-02
      相关资源
      最近更新 更多