Mapstruct с @MappingTarget не вызывает lombok Builder build () - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь создать метод патча с использованием Mapstruct и Lombok Builder. Но в сгенерированном коде отсутствует build() вызов

Mapper с удалением нулевых значений:

@Mapper(
        nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS,
        nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE

)
public interface CartMapper {
    CartMapper INSTANCE = Mappers.getMapper(CartMapper.class);

    Cart cartRequestToCart(CartRequest cartRequest);

    Cart patch(CartRequest cartRequest, @MappingTarget Cart cart);
}

Вложенные классы имеют те же аннотации ломбоков, что и Корзина:

@Builder
@AllArgsConstructor(access = AccessLevel.PACKAGE)
@Getter
@Setter
@FieldDefaults(level = AccessLevel.PRIVATE)
public class Cart {

    Customer customer;
    Owner owner;
    Integer price;
    String voucher;
}

Все вложенные классы имеют те же аннотации lombok, что и CartRequest, и структура такая же, как структура целевых объектов

@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
public class CartRequest {
    CustomerRequest customer;
    OwnerRequest owner;
    Integer price;
    String voucher;
}

Для метода cartRequestToCart все в порядке, здесь вызываются сборщики, а также во вложенных методах

    @Override
    public Cart cartRequestToCart(CartRequest cartRequest) {
        if ( cartRequest == null ) {
            return null;
        }

        CartBuilder cart = Cart.builder();

        if ( cartRequest.getCustomer() != null ) {
            cart.customer( customerRequestToCustomer( cartRequest.getCustomer() ) );
        }
        if ( cartRequest.getOwner() != null ) {
            cart.owner( ownerRequestToOwner( cartRequest.getOwner() ) );
        }
        if ( cartRequest.getPrice() != null ) {
            cart.price( cartRequest.getPrice() );
        }
        if ( cartRequest.getVoucher() != null ) {
            cart.voucher( cartRequest.getVoucher() );
        }

        return cart.build();
    }

Для метода patch генерируется это и здесь в некоторых установщиках отсутствует build() call

    @Override
    public Cart patch(CartRequest cartRequest, Cart cart) {
        if ( cartRequest == null ) {
            return null;
        }

        if ( cartRequest.getCustomer() != null ) {
            if ( cart.getCustomer() == null ) {
                cart.setCustomer( Customer.builder() ); // HERE build() missing
            }
            customerRequestToCustomer1( cartRequest.getCustomer(), cart.getCustomer() );
        }
        if ( cartRequest.getOwner() != null ) {
            if ( cart.getOwner() == null ) {
                cart.setOwner( Owner.builder() ); // HERE build() missing
            }
            ownerRequestToOwner1( cartRequest.getOwner(), cart.getOwner() );
        }
        if ( cartRequest.getPrice() != null ) {
            cart.setPrice( cartRequest.getPrice() );
        }
        if ( cartRequest.getVoucher() != null ) {
            cart.setVoucher( cartRequest.getVoucher() );
        }

        return cart;
    }

Несколько советов, как это исправить? Большое спасибо.

1 Ответ

0 голосов
/ 02 апреля 2019

Это ошибка в MapStruct 1.3.0.Final.

Я бы предложил следовать за mapstruct / mapstruct # 1742 для исправления.

Текущее решение состоит в том, чтобы полностью отключить сборщиков, установив NoOpBuilderProvider через SPI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...