与都支持多态性的 Jackson 和 Hibernate 合作,我想找到一个很好的 Java 映射库,它可以帮助我分离不同的层(主要是 DTO/实体),并且还支持多态性。
Orika 似乎支持多态性(但并非没有类型声明)。 https://orika-mapper.github.io/orika-docs/
我没有找到其他两个竞争者 Selma 和 MapStruct 的好例子。 http://www.selma-java.org/ http://mapstruct.org/
有人使用过这些库吗?
更新1: 测试用例之一。
public class PolymorphicMapperTest {
public abstract class Animal{
private String fooAnimal;
public Animal(String fooAnimal) {
this.fooAnimal = fooAnimal;
}
public String getFooAnimal() {
return fooAnimal;
}
}
public class Cat extends Animal {
private String fooCat;
public Cat(String fooAnimal, String fooCat) {
super(fooAnimal);
this.fooCat = fooCat;
}
}
public class Snake extends Animal {
private String fooSnake;
public Snake(String fooAnimal, String fooSnake) {
super(fooAnimal);
this.fooSnake = fooSnake;
}
public String getFooSnake() {
return fooSnake;
}
}
public abstract class AnimalDTO{
public String fooAnimal;
}
public class CatDTO extends AnimalDTO {
public String fooCat;
}
public class SnakeDTO extends AnimalDTO {
public String fooSnake;
}
@Test
public void testMapping() {
Mapper mapper = MyAwesomeMapper();
mapper.declare(Animal.class,AnimalDTO.class);
SnakeDTO snakeDTO = new SnakeDTO();
snakeDTO.fooAnimal = "Snake";
snakeDTO.fooSnake = "Anaconda";
//I don't want the mapper to know the input Type because Jackson will hide it to me.
AnimalDTO animalDTOToMap = (AnimalDTO) snakeDTO;
Animal animal1 = mapper.map(animalDTOToMap);
Assert.isTrue(animal1 instanceof Snake);
//And when casted we want to find Animal and Snake fields mapped
CatDTO catDTO = new CatDTO();
catDTO.fooAnimal = "Cat";
catDTO.fooCat = "Persan";
AnimalDTO secondAnimalDTOToMap = (AnimalDTO) catDTO;
Animal animal2 = mapper.map(secondAnimalDTOToMap);
Assert.isTrue(animal2 instanceof Cat);
//And when casted we want to find Animal and Cat fields mapped
}
}
最佳答案
该票证已在 MapStruct 积压工作中打开 https://github.com/mapstruct/mapstruct/issues/131
关于Java 类型-细化映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48939340/