Mapstruct Отображение дочернего и родительского классов в качестве источника

В настоящее время пишется некий перехватчик, который прикрывает некоторые модели запросов в другую модель. У меня есть сопоставления для всех моих различных типов запросов, однако, поскольку он находится на уровне перехватчика, я получаю объект 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);

person Paul    schedule 04.09.2018    source источник


Ответы (1)


Я думаю это невозможно

но вы можете сделать свою реализацию в своем классе сопоставления

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

}
person Bertrand Cedric    schedule 04.09.2018
comment
Спасибо, это работа. Однако было бы идеально, если бы отображение использовало наиболее конкретное отображение. - person Paul; 04.09.2018
comment
@Paul Посмотрите на проблему # 131 в багтрекере Mapstruct. Это невозможно напрямую, вы получите только обходные пути. И тот, который представлен здесь, является наиболее часто используемым. - person jannis; 05.10.2018
comment
Что касается ответа: MyMapper все еще может быть интерфейсом, если вы реализуете toLoggableEntity как метод интерфейса по умолчанию. - person jannis; 09.10.2018