You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 08:45:32