0

考虑两个对象:

public class ClassA {

    private List<Animal> animals;

    public List<Animal> getAnimals() {
        return animals;
    }

    public void setAnimals(List<Animal> animals) {
        this.animals = animals;
    }

}

public class ClassB {

    private List<OtherAnimals> animals;

    public List<OtherAnimals> getAnimals() {
        return animals;
    }

    public void setAnimals(List<OtherAnimals> animals) {
        this.animals = animals;
    }

}

使用 orika-mapper:

public class AnimalMapper extends ConfigurableMapper {

    @Override
    protected void configure(MapperFactory factory) {
        factory.classMap(ClassA.class, ClassB.class) //
                .mapNulls(true) //
                .byDefault() //
                .register();
    }

}

然后以下测试失败:

@Test
public void testMap() throws Exception {
    ClassA classA = new ClassA();

    ClassB outcome = classUnderTest.map(classA, ClassB.class);

    assertThat(outcome.getAnimal(), is(nullValue()));
}

那是因为outcome.getAnimal()已经变成了一个空数组列表。为什么会这样? 另一个非常值得注意的事情是:如果我用内容填充这两个列表,映射甚至会发生!虽然它们是不同的类型!

那是

@Test
public void testMap() throws Exception {
    ClassA classA = new ClassA();
    Animal animal = new Animal();
    animal.setName("Brix");
    classA.setAnimals(Arrays.asList(animal));

    ClassB outcome = classUnderTest.map(classA, ClassB.class);

    assertThat(outcome.getAnimal().get(0).getName(), is("Brix"));
}

public class Animal {

    String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

public class OtherAnimal {

    String name;
    int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

}

成功。可以指望这一点,这安全吗?

4

1 回答 1

1

发生这种情况是因为 Orika 将使用 byDefault 设置动态创建映射器。当 Orika 找到具有相同名称和兼容类型的字段时,它实际上是安全的(A 的列表到 B 的集合,然后为 A 到 B 创建另一个映射器,它似乎有一个共同的字段名称:字符串)。

如果它不符合您的口味,您可以使用 useAutoMapping(boolean useAutoMapping); 禁用这个“魔法”。

http://orika-mapper.github.io/orika-docs/mapper-factory.html

于 2016-05-30T22:28:43.147 回答