当前位置: 首页 > 知识库问答 >
问题:

Orika空列表

唐威
2023-03-14

考虑2个对象:

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

这是因为结果。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;
    }

}

成功。人们能指望这一点吗?这安全吗?

共有1个答案

蒋健
2023-03-14

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

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

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

 类似资料:
  • 我有以下课程: 我想要两个同一类的对象,比方说: 当我把映射到时,应该保持,因为有一个。 如何使用? 我试过这样的方法: 提前谢谢

  • 我有一个对象带有字段

  • Orika 是一个 Java Bean 映射框架。 示例代码: mapperFactory.classMap(BasicPerson.class, BasicPersonDto.class)   .mapNulls(true).mapNullsInReverse(true)   .field("field1", "fieldOne")   .mapNulls(false).mapNullsInRe

  • 这些类映射不能用于双向映射。所以,我使用了两个不同的映射。但是使用两个不同的具有双向映射的类映射使上述方法都不起作用。我正在寻找一种方法来使用一个classmap只用于单向映射,这样我就可以使用上面的两个。 任何帮助都将不胜感激。谢了。

  • 这很好,Orika自动确定bean上的属性名,并在expr中给我。但它没有告诉我类型。它也没有告诉我我试图映射到什么。在本例中,我只需假设目标是ResultSet。 如何知道要将数据放入的expr的类型?如果是,我将进行内联绑定调用,并告诉Orika使用。如果是时间戳,我将进行内联绑定调用并告诉Orika使用 我如何知道我试图从映射到,而不是从映射到?

  • DTO: Rest控制器: 服务类别: 谢了!