Java 映射子类和父类作为源的Mapstruct

Java 映射子类和父类作为源的Mapstruct,java,mapstruct,Java,Mapstruct,目前正在编写一些拦截器,将一些请求模型转换为另一个模型。我对所有不同类型的请求都有映射,但是因为它是在拦截器级别,所以我得到了一个请求模型的java对象。我为对象添加了一个映射,这样我就可以只传递我在拦截器中得到的对象,而不是将其强制转换为我有映射的类型之一,但是,它不起作用,它没有映射任何字段。有趣的是,不知何故,当我搞乱映射的定义顺序时,它起了作用,但它并不一致,所以我不确定我是如何让它起作用的 @Mappings({ @Mapping(source = "myField",

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

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

我认为这是不可能的

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

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

}

谢谢,这是一个变通办法。不过,如果映射将使用最具体的映射,这将是理想的。@Paul请查看Mapstruct的bugtracker中的问题。这是不可能直接实现的,您只能找到解决办法。这里介绍的是最常用的一个。关于答案:
MyMapper
仍然可以是一个接口,如果您将
toLoggableEntity
实现为一个接口。