Декоратор предназначен для расширения отображения, а не для его замены.MapStruct не может знать, что вы отображаете ваш totalFare
в декораторе.У вас есть 2 варианта:
Определить пользовательский метод сопоставления
В вашем OneMapper
вы можете добавить метод по умолчанию, который будет выполнять сопоставление (как говорит ошибка.
@Mapper
@DecoratedWith(OneMapperDecorator.class)
public interface OneMapper {
@Mapping(target = "totalFare", source = "price");
TwoObject convertToTwoObject(OneObject one);
default BigDecimal map(String value) {
return value == null ? null : new BigDecimal(value);
}
}
Игнорировать сопоставление
Если вы хотите выполнить сопоставление в своем декораторе, вам нужно указать MapStruct, чтобы оно не отображалось.
@Mapper
@DecoratedWith(OneMapperDecorator.class)
public interface OneMapper {
@Mapping(target = "totalFare", ignore = true);
TwoObject convertToTwoObject(OneObject one);
}
Один совет от меняесли вы используете свой делегат только для сопоставления дополнительных полей, я бы либо добавил пользовательские методы, либо использовал @AfterMapping
и @BeforeMapping
для обработки этого.