MapStruct 映射器 returns 空映射对象
MapStruct mapper returns empty mapped object
我正在尝试使用 MapStruct 在 dto 和实体对象之间进行映射转换,但是生成的映射器实现仅 returns empty 映射对象。
BeerMapperImpl
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2020-11-05T07:42:21+0800",
comments = "version: 1.3.0.Final, compiler: javac, environment: Java 11 (Oracle Corporation)"
)
@Component
public class BeerMapperImpl implements BeerMapper {
@Override
public BeerDto beerToBeerDto(Beer beer) {
if ( beer == null ) {
return null;
}
BeerDto beerDto = new BeerDto();
return beerDto;
}
}
下面是我的代码。
pom.xml
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.3.0.Final</version>
</dependency>
.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.0.Final</version>
</path>
<path>
<groupId>
org.projectlombok
</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
</annotationProcessorPaths>
<compilerArgs>
<compilerArg>
-Amapstruct.defaultComponentModel=spring
</compilerArg>
</compilerArgs>
</configuration>
</plugin>
BeerMapper.java
@Mapper(uses = {DateMapper.class})
public interface BeerMapper {
BeerDto beerToBeerDto(Beer beer);
Beer beerDtoToBeer(Beer dto);
}
任何人都可以帮助建议我的代码中可能出现的问题吗?谢谢!
我在将 spring 启动程序从 2.3.5.RELEASE 降级到 2.1.5.RELEASE.
后解决了这个问题
我删除了注释处理器路径标记并将 bot lombok 和 mapstruct 声明为依赖项。
link 有类似问题:
我遇到了一个类似的问题,当原始对象被填充时,mapstruct 映射创建的对象中的所有值都为空值。当我检查目标中生成的映射器时,生成的实现不包含实际映射。当我对项目中的 Mapper 进行一些小改动并保存时,我发现这个问题很容易解决。使用适当的映射重新生成目标中的映射器。我不确定为什么映射器生成不正确,但这是对我有用的快速修复。
我找到了无需降级 spring 引导的解决方案。问题是我使用 lombok
来生成 getter 和 setter,另一方面 mapstruct
在你的对象中寻找 getter 和 setter 来填充它们,但在这种情况下它不能简单地找到它们因为在编译期间 mapstruct
在 lombok
可以生成它们之前 运行ning。
解决办法就是在你的pom.xml文件中先写lombok
的配置,再写mapstruct
的配置,这样就可以先执行lombok。确保 运行 clean compile
删除旧文件。
maven-compiler-plugin 的工作配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<!--Project Lombok compile preprocessor-->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<!--Maps Struct compile preprocessor-->
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct-ver}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
我在 dto 中添加了一个 @AllArgsConstructor,在删除它之后 - 工作正常。愚蠢,但有效。依赖和路径的顺序很好,spring引导版本较旧然后建议降级
我正在尝试使用 MapStruct 在 dto 和实体对象之间进行映射转换,但是生成的映射器实现仅 returns empty 映射对象。
BeerMapperImpl
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2020-11-05T07:42:21+0800",
comments = "version: 1.3.0.Final, compiler: javac, environment: Java 11 (Oracle Corporation)"
)
@Component
public class BeerMapperImpl implements BeerMapper {
@Override
public BeerDto beerToBeerDto(Beer beer) {
if ( beer == null ) {
return null;
}
BeerDto beerDto = new BeerDto();
return beerDto;
}
}
下面是我的代码。
pom.xml
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.3.0.Final</version>
</dependency>
.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.0.Final</version>
</path>
<path>
<groupId>
org.projectlombok
</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
</annotationProcessorPaths>
<compilerArgs>
<compilerArg>
-Amapstruct.defaultComponentModel=spring
</compilerArg>
</compilerArgs>
</configuration>
</plugin>
BeerMapper.java
@Mapper(uses = {DateMapper.class})
public interface BeerMapper {
BeerDto beerToBeerDto(Beer beer);
Beer beerDtoToBeer(Beer dto);
}
任何人都可以帮助建议我的代码中可能出现的问题吗?谢谢!
我在将 spring 启动程序从 2.3.5.RELEASE 降级到 2.1.5.RELEASE.
后解决了这个问题我删除了注释处理器路径标记并将 bot lombok 和 mapstruct 声明为依赖项。
link 有类似问题:
我遇到了一个类似的问题,当原始对象被填充时,mapstruct 映射创建的对象中的所有值都为空值。当我检查目标中生成的映射器时,生成的实现不包含实际映射。当我对项目中的 Mapper 进行一些小改动并保存时,我发现这个问题很容易解决。使用适当的映射重新生成目标中的映射器。我不确定为什么映射器生成不正确,但这是对我有用的快速修复。
我找到了无需降级 spring 引导的解决方案。问题是我使用 lombok
来生成 getter 和 setter,另一方面 mapstruct
在你的对象中寻找 getter 和 setter 来填充它们,但在这种情况下它不能简单地找到它们因为在编译期间 mapstruct
在 lombok
可以生成它们之前 运行ning。
解决办法就是在你的pom.xml文件中先写lombok
的配置,再写mapstruct
的配置,这样就可以先执行lombok。确保 运行 clean compile
删除旧文件。
maven-compiler-plugin 的工作配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<!--Project Lombok compile preprocessor-->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<!--Maps Struct compile preprocessor-->
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct-ver}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
我在 dto 中添加了一个 @AllArgsConstructor,在删除它之后 - 工作正常。愚蠢,但有效。依赖和路径的顺序很好,spring引导版本较旧然后建议降级