MapStruct 偶尔生成错误映射实现类的原因及解决办法咨询
MapStruct 偶尔生成错误映射实现类的原因及解决办法咨询
大家好,我遇到了一个非常棘手的MapStruct问题,折腾了好久都没找到根源,希望能得到各位的帮助。
先跟大家说下我的技术环境:
- Java 8
- Spring Boot 2.3.4.RELEASE
- Maven 作为构建工具
- IntelliJ IDEA 作为开发IDE
我定义了两个DTO类:VehicleMasterDto和VehicleDetailDto,然后用MapStruct写了如下的映射接口:
@Mapper(componentModel = "spring", nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE) public interface MapStructVehicleMapper { Vehicle toVehicle(VehicleMasterDto dto); void updateVehicleFromDto(@MappingTarget Vehicle vehicle, VehicleDetailDto vehicleDetailDto); }
下面是我在pom.xml中配置的MapStruct相关依赖和Maven编译插件:
<!-- MapStruct --> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.5.5.Final</version> </dependency> <!-- MapStruct processor --> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.5.5.Final</version> <scope>provided</scope> </dependency> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> <annotationProcessorPaths> <!-- MapStruct processor --> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.5.5.Final</version> </path> <!-- Lombok --> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> </path> </annotationProcessorPaths> </configuration> </plugin>
现在的问题非常奇怪:编译时MapStruct生成的实现类行为完全随机。有时候它能生成正确的实现类,就像下面这样,所有属性的映射逻辑都正常:
@Generated( value = "org.mapstruct.ap.MappingProcessor", date = "2025-08-25T19:01:41+0530", comments = "version: 1.5.5.Final, compiler: javac, environment: Java 1.8.0_462 (Private Build)" ) @Component public class MapStructVehicleMapperImpl implements MapStructVehicleMapper { @Override public Vehicle toVehicle(VehicleMasterDto dto) { if (dto == null) { return null; } Vehicle vehicle = new Vehicle(); vehicle.setVehicleNo(dto.getVehicleNo()); vehicle.setDriverMobileNo(dto.getDriverMobileNo()); vehicle.setDriverEmail(dto.getDriverEmail()); vehicle.setMaxWeight(dto.getMaxWeight()); vehicle.setMaxCapacity(dto.getMaxCapacity()); return vehicle; } @Override public void updateVehicleFromDto(Vehicle vehicle, VehicleDetailDto vehicleDetailDto) { if (vehicleDetailDto == null) { return; } if (vehicleDetailDto.getDriverMobileNo() != null) { vehicle.setDriverMobileNo(vehicleDetailDto.getDriverMobileNo()); } if (vehicleDetailDto.getDriverEmail() != null) { vehicle.setDriverEmail(vehicleDetailDto.getDriverEmail()); } if (vehicleDetailDto.getMaxWeight() != null) { vehicle.setMaxWeight(vehicleDetailDto.getMaxWeight()); } vehicle.setMaxCapacity(vehicleDetailDto.getMaxCapacity()); } }
但有时候,生成的实现类完全不对——所有属性的映射逻辑都消失了,就像下面这个例子,只是新建了对象但没有任何属性赋值,更新方法也什么都没做:
@Generated( value = "org.mapstruct.ap.MappingProcessor", date = "2025-08-26T09:43:06+0530", comments = "version: 1.5.5.Final, compiler: javac, environment: Java 1.8.0_462 (Private Build)" ) @Component public class VehicleMapperMapStructImpl implements VehicleMapperMapStruct { @Override public Vehicle toVehicle(VehicleMasterDto dto) { if (dto == null) { return null; } Vehicle vehicle = new Vehicle(); return vehicle; } @Override public void updateVehicleFromDto(Vehicle vehicle, VehicleDetailDto vehicleDetailDto) { if (vehicleDetailDto == null) { return; } } }
这种随机出现的问题让我完全不敢把MapStruct用在生产环境里,现在只能临时手动编写映射类来替代。有没有大佬能帮我分析一下,这背后到底是什么原因导致的?
内容来源于stack exchange
相关产品推荐
相关产品推荐

