当前位置: 首页 > 知识库问答 >
问题:

带有@MappingTarget的Mapstruct不调用lombok Builder build()

贺皓
2023-03-14
@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;
}

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

    @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();
    }

For方法patch是在此处生成的,在某些设置器中缺少build()调用

    @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个答案

夹谷成龙
2023-03-14

Lombok 1.18.16的更新。

启动maven-compiler-plugin的此版本工作配置


<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <annotationProcessorPaths>
            <path>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok-mapstruct-binding</artifactId>
                <version>0.2.0</version>
            </path>
            <path>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-processor</artifactId>
                <version>1.4.1.Final</version>
            </path>
            <path>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.16</version>
            </path>
        </annotationProcessorPaths>
    </configuration>
</plugin>

path节的顺序很重要!

 类似资料:
  • } 但是在映射器实现中,我看到清除了Target的列表,我不需要它: } 我是读错了还是做错了?

  • 在使用MapStruct、Lombock和Spring时,我在Tomcat 9中的应用程序部署中遇到以下错误: 我的spring配置类在包层次结构的根目录中设置包扫描。映射器的实现也是在target/generated-sources下生成的: 我的错误表明Spring找不到实现类,我遗漏了什么?我试图将generated-sources文件夹添加到构建路径并将其包含在包扫描中,但没有成功。

  • 对于内部映射,我为AWS SDK模型V2创建了POJO/DTO 为了映射变量,我正在使用Mapper注释使用MapStruct,但是在注释处理过程中生成的实现没有使用任何getter,而是正确添加了带有生成器的setter,但使用null AWS SDK V2模型没有带前缀get的getters,它直接是变量的名称,如何为这个场景配置映射结构。

  • 我遇到了这样一种情况,我的映射方法有3个参数,所有这三个参数都用于派生目标类型的一个属性。 我在接口中创建了一个默认映射方法,保留了用于派生属性的逻辑,现在为了调用这个方法,我可以在注释中使用。 有没有什么方法可以在mapstruct注释中做到这一点,比如,我试着用expression属性和qualifiedByName来注释注释,但它不起作用:

  • 如果标题不清楚,我深表歉意,让我给出示例代码: UpdateProfileDto 编码映射 密码映射器 用户映射器 生成的UserMapperImpl 从生成的,我不仅想检查是否有值。。。但是要检查和是否有值,请继续执行。 我的意思是这样的: 问题 我怎么能改变我的映射接口,以便我将检查和,然后它将设置目标,并且仍然使用? 如果我尝试使用而不是并检查和是否都有值,然后将设置为。否则,它不会对使用做

  • 我试图让Mapstruct注释处理器在Gradle项目中的IntelliJ中工作。 我所做的: > 在我的中配置了Mapstruct注释处理器: 在“构建、执行、部署->构建工具->gradle->runner”下的首选项中选择了“委托IDE构建/运行操作来分级”