maven Mapstruct和Lombok在Sping Boot 2.4及更高版本中出现意外结果此版本是否有任何变通方法或问题?

avwztpqn  于 2023-03-01  发布在  Maven
关注(0)|答案(1)|浏览(149)

我使用的是最新版本的Sping Boot 2.2.5以上和Java 15、lombok、Mapstruct来Map一些pojo。
当使用***版本2.2.5的 Spring Boot ***时,我得到了预期的结果:

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2021-01-02T21:59:24+0100",
    comments = "version: 1.4.1.Final, compiler: javac, environment: Java 15.0.1 (Oracle Corporation)"
)
@Component
public class ProduitMapperImpl implements ProduitMapper {

    @Override
    public ProduitDtoResponse produitToProduitDtoResponse(Produit produit) {
        if ( produit == null ) {
            return null;
        }

    ProduitDtoResponseBuilder produitDtoResponse = ProduitDtoResponse.builder();

    produitDtoResponse.id( produit.getId() );
    produitDtoResponse.nom( produit.getNom() );
    produitDtoResponse.prix( produit.getPrix() );

    return produitDtoResponse.build();
}

@Override
public Produit produitToProduitDtoResponse(ProduitDtoResponse produitDto) {
    if ( produitDto == null ) {
        return null;
    }

    ProduitBuilder produit = Produit.builder();

    produit.id( produitDto.getId() );
    produit.nom( produitDto.getNom() );
    produit.prix( produitDto.getPrix() );

    return produit.build();
    }
}

但是当使用 Version 2.4 and above 时,* 没有builder*,相反,我有 *java new关键字,没有其他字段 *,我得到:
这是maven pom会议,这是行不通的:BOM

@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2021-01-02T22:05:16+0100",
    comments = "version: 1.4.1.Final, compiler: javac, environment: Java 15.0.1 (Oracle Corporation)"
)

@Component
public class ProduitMapperImpl implements ProduitMapper {

    @Override
    public ProduitDtoResponse produitToProduitDtoResponse(Produit produit) {
        if ( produit == null ) {
            return null;
        }
    ProduitDtoResponse produitDtoResponse = new ProduitDtoResponse();

    return produitDtoResponse;
}

@Override
public Produit produitToProduitDtoResponse(ProduitDtoResponse produitDto) {
    if ( produitDto == null ) {
        return null;
    }

    Produit produit = new Produit();

    return produit;
}
}

我唯一改变的是Sping Boot 版本,它按预期工作,请问Spring Boot的 * 版本2.4及以上 * 是否有任何变通方法或问题?

wmtdaxz3

wmtdaxz31#

您的问题是,由于pom.xml中的这一点:

<version>${lombok.version}</version>

您将从您的父pom的父pom spring-boot-starter-parent(您的祖父pom?)获得Lombok版本,因此使用Sping Boot 2. 4. 0您将获得Lombok的更新版本。
从Lombok 1.18.16开始,您需要添加另一个依赖项。请参阅MapStruct FAQ中的回答:
如果您使用的是Lombok 1.18.16或更新版本,您还需要添加lombok-mapstruct-binding以使Lombok和MapStruct协同工作。
它们有一个sample project来演示如何一起使用它们。下面是示例pom.xml的相关部分:

<properties>
    <!-- . . . -->
    <lombok-mapstruct-binding.version>0.2.0</lombok-mapstruct-binding.version>
</properties>

<!-- . . . -->

        <annotationProcessorPaths>
            <!-- . . . -->
            <path>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok-mapstruct-binding</artifactId>
                <version>${lombok-mapstruct-binding.version}</version>
            </path>
        </annotationProcessorPaths>

相关问题