Spring Boot 2.4 及更高版本的 Mapstruct 和 Lombok 意外结果此版本是否有任何解决方法或问题?
Mapstruct and Lombok unexpected result with Spring Boot 2.4 and above Is there any workaround or issues with this version?
我正在使用最新版本的 Spring 启动 2.2.5 和 Java 15、lombok、Mapstruct 来映射一些 pojos。
当使用 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();
}
}
但是当使用版本 2.4 及更高版本 时,没有生成器,相反我有 java 新关键字而不是其他字段,我得到:
这是不起作用的 maven pom conf: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;
}
}
我唯一改变的是 Spring 引导版本,它按预期工作,版本 2.4 及更高版本 是否有任何解决方法或问题 Spring 开机,好吗?
你的问题是因为你的 pom.xml
:
<version>${lombok.version}</version>
您正在从 parent pom 的 parent pom 获取 Lombok 版本,spring-boot-starter-parent
(您的 grandparent pom?),因此 Spring Boot 2.4.0 你正在使用更新版本的 Lombok。
从 Lombok 1.18.16 开始,您需要添加另一个依赖项。请参阅 MapStruct FAQ 中的此答案:
If you are using Lombok 1.18.16 or newer you also need to add lombok-mapstruct-binding in order to make Lombok and MapStruct work together.
他们有一个 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>
我正在使用最新版本的 Spring 启动 2.2.5 和 Java 15、lombok、Mapstruct 来映射一些 pojos。
当使用 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();
}
}
但是当使用版本 2.4 及更高版本 时,没有生成器,相反我有 java 新关键字而不是其他字段,我得到:
这是不起作用的 maven pom conf: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;
}
}
我唯一改变的是 Spring 引导版本,它按预期工作,版本 2.4 及更高版本 是否有任何解决方法或问题 Spring 开机,好吗?
你的问题是因为你的 pom.xml
:
<version>${lombok.version}</version>
您正在从 parent pom 的 parent pom 获取 Lombok 版本,spring-boot-starter-parent
(您的 grandparent pom?),因此 Spring Boot 2.4.0 你正在使用更新版本的 Lombok。
从 Lombok 1.18.16 开始,您需要添加另一个依赖项。请参阅 MapStruct FAQ 中的此答案:
If you are using Lombok 1.18.16 or newer you also need to add lombok-mapstruct-binding in order to make Lombok and MapStruct work together.
他们有一个 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>