2016-05-30 18 views
0

Betrachten Sie die 2 Objekte:Orika null zur Liste

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

} 

Mit Orika-Mapper:

public class AnimalMapper extends ConfigurableMapper { 

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

} 

Dann wird der folgende Test nicht bestanden:

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

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

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

Das liegt daran, dass outcome.getAnimal() geworden ist eine leere Array-Liste. Warum passiert das? Die andere ganz bemerkenswerte Sache ist: Wenn ich diese 2 Listen mit Inhalt fülle, findet das Mapping sogar statt! Obwohl sie von verschiedenen Arten sind!

Das

@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")); 
} 

mit

public class Animal { 

    String name; 

    public String getName() { 
     return name; 
    } 

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

} 

und

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

} 

erfolgreich ist. Kann man darauf zählen und ist das sicher?

Antwort

1

Dies passiert, weil Orika einen Mapper im laufenden Betrieb mit den Standardeinstellungen erstellt. Und es ist wirklich sicher, wenn Orika Felder mit demselben Namen und kompatiblen Typen findet (Liste von A bis Sammlung von B, dann erzeuge einen anderen Mapper für A nach B, der einen gemeinsamen Feldnamen zu haben scheint: String).

Wenn es nicht Ihrem Geschmack entspricht, können Sie diese "Magie" mit useAutoMapping (boolean useAutoMapping) deaktivieren;

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