У меня есть картограф Mapstruct, который уже определен в общей библиотеке, которая в настоящее время используется моим приложением. У меня есть новый метод сопоставления, который я хочу добавить к этому сопоставителю, и он c указан в моем приложении, поэтому я не хочу изменять исходный сопоставитель, чтобы добавить эту функциональность.
Я попытался расширить интерфейс, но я продолжаю сталкиваться с проблемами. В настоящее время с приведенным ниже кодом он будет компилироваться, но выдает исключения времени выполнения, поскольку Mapstruct не создает класс MyMapperExtendedImpl.
Вызвано: java .lang.RuntimeException: java .lang. ClassNotFoundException: не удалось найти реализацию для com.whatever.package.name.MyMapperExtended
У меня есть предупреждение от Sonar о том, что когда я пытаюсь получить доступ к картографу, вызывая Mappers.getMapper (MyMapperExtended. class) , что у него нет аннотации @Mapper. Затем я изменил MyMapperExtended.class, удалив аннотацию @MapperConfig и заменив ее тем же @ Mapper (imports = {SomeUtilityClass.class}) из родительского сопоставителя. Код больше не компилируется, и у меня есть ряд ошибок, в которых говорится, что не удается найти определенные переменные. Эти переменные выглядят как параметры функции, поскольку их имена точно совпадают.
Как правильно расширить существующий интерфейс MyMapper, чтобы добавить к нему дополнительные методы сопоставления?
@MapperConfig(uses = MyMapper.class)
public interface MyMapperExtended extends MyMapper {
default List<ChildClass> someObjectListToChildClassList(List<SomeObject> someList) {
//Some special logic here and looping which makes it so cannot use the @Mapping annotations
//Call the mapper for the parent so that the base properties are mapped
ParentClass mappedParentClass = this.someObjectListToParentClassList(someList);
//Uses a copy constructor to copy over the mapped base properties
ChildClass myChildClass = new ChildClass(mappedParentClass);
myChildClass.setExtraProperty("whatever value");
return myChildClass;
}
}
Mapper из общая общая библиотека
@Mapper(imports = { SomeUtilityClass.class })
public interface MyMapper {
@Mapping(target = "id", source = "someId")
@Mapping(target = "name", source = "name")
@Mapping(target = "someFieldWeIgnoreWhileMapping", ignore = true)
ParentClass someObjectListToParentClass(SomeObject someObject)
List<ParentClass> someObjectListToParentClassList(List<SomeObject> someList)
}
Классы ParentClass и ChildClass также отображаются (упрощено, поэтому не отображаются геттеры / сеттеры для переменных-членов)
public class ParentClass {
UUID id;
String name;
String someFieldWeIgnoreWhileMapping;
public ParentClass() {}
}
public class ChildClass {
String extraProperty;
public ChildClass(ParentClass parent) {
super();
this.setId(parent.getId());
this.setName(parent.getName());
}
}
Класс SomeObject, который используется в качестве исходного объекта для отображения
public class SomeObject {
UUID someId;
String name;
String someFieldWeIgnore;
public SomeObject () {}
}