Mapper decorator не компилируется - PullRequest
0 голосов
/ 05 декабря 2018

Mapper decorator для моего mapper не компилируется. Mapper компилируется, но не декоратор.Потому что во время сборки я получаю ошибку преобразования типа, хотя я делаю это в декораторе mapper.Что еще можно добавить?

код картографа:

 @Mapper
    @DecoratedWith(OneMapperDecorator.class)

    public interface OneMapper {
     public TwoObject convertToTwoObject(OneObject one);
    }

код декоратора:

     public abstract class OneMapperDecorator implements OneMapper {

            private final OneMapper delegate;

            public OneMapperDecorator (OneMapper delegate) {
                this.delegate = delegate;
            }
            @Override
            public TwoObject convertToTwoObject(OneObject one)
            {
                TwoObject two=delegate.convertToTwoObject(one);

                two.setTotalFare(new BigDecimal(one.getPrice()));//string to bigdecimal conversion
                return two;
            }
}

1 Ответ

0 голосов
/ 05 декабря 2018

Декоратор предназначен для расширения отображения, а не для его замены.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 для обработки этого.

...