Orika null 列表
Orika null to List
考虑 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()));
}
那是因为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;
}
}
成功。 可以指望吗,这安全吗?
发生这种情况是因为 Orika 将使用 byDefault 设置即时创建映射器。当 Orika 找到具有相同名称和兼容类型的字段(A 的列表到 B 的集合,然后为 A 到 B 创建另一个似乎具有公共字段 name:String)的映射器时,它实际上是安全的。
如果它不符合您的口味,您可以禁用它 "magic" 使用
useAutoMapping(boolean useAutoMapping);
http://orika-mapper.github.io/orika-docs/mapper-factory.html
考虑 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()));
}
那是因为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;
}
}
成功。 可以指望吗,这安全吗?
发生这种情况是因为 Orika 将使用 byDefault 设置即时创建映射器。当 Orika 找到具有相同名称和兼容类型的字段(A 的列表到 B 的集合,然后为 A 到 B 创建另一个似乎具有公共字段 name:String)的映射器时,它实际上是安全的。
如果它不符合您的口味,您可以禁用它 "magic" 使用 useAutoMapping(boolean useAutoMapping);
http://orika-mapper.github.io/orika-docs/mapper-factory.html