首页 > 解决方案 > Mapstruct 映射子类和父类作为源

问题描述

目前正在编写一些拦截器,将一些请求模型转换为另一个模型。我对所有不同类型的请求都有映射,但是因为它处于拦截器级别,所以我得到了请求模型的 java 对象。我为 Object 添加了一个映射,这样我就可以传递我在拦截器中得到的 Object,而不是将它转换为我有映射的类型之一,但是,它不起作用,它没有映射任何字段. 有趣的是,不知何故,当我弄乱我的映射定义的顺序时,它起作用了,但是它并不一致,所以我不确定我是如何让它起作用的。

   @Mappings({
    @Mapping(source = "myField", target = "myOtherField")
})
NiceModel toLoggableEntity(RequestModel1 request);

  @Mappings({
    @Mapping(source = "myField2", target = "myOtherField")
})
NiceModel toLoggableEntity(RequestModel2 request);

//so that I can pass Object from the interceptor without having 
//to figure out which request model to cast it to  
NiceModel toLoggableEntity(Object request);

标签: javamapstruct

解决方案


我认为这是不可能的

但是您可以在映射类中进行实现

public abstract class MyMapper {
    @Mappings({
            @Mapping(source = "myField", target = "myOtherField")
    })
    abstract NiceModel toLoggableEntity(RequestModel1 request);

    @Mappings({
            @Mapping(source = "myField2", target = "myOtherField")
    })
    abstract NiceModel toLoggableEntity(RequestModel2 request);

    NiceModel toLoggableEntity(Object request) {
        if (request instanceof RequestModel1) {
            return toLoggableEntity((RequestModel1) request);
        }
        if (request instanceof RequestModel2) {
            return toLoggableEntity((RequestModel2) request);
        }
        //manage this case
        return null;
    }

}

推荐阅读