Java 类型-细化映射

标签 java polymorphism automapper mapstruct orika

与都支持多态性的 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/

相关文章:

parsing - 在 Rust 中返回多种类型的惯用方式

java - 单击按钮后从微调器中删除对象

java - 如何以编程方式启动 OSGi

java.lang.OutOfMemoryError : Java heap space when doing a JDBC read from Oracle 错误

c# - 具有下划线/PascalCase 属性的 Automapper 命名约定

AutoMapper:ForMember 和 ForSourceMember 之间有什么区别?

collections - 使用 AutoMapper 映射只读子集合

Android 上的 Java : Does adding item to ConcurrentLinkedQueue copy it

c++ - 抽象和纯虚拟方法

Java继承问题