MapStruct未调用自定义String转Enum实现,该如何解决?
解决步骤
修正自定义转换方法的类型匹配
将getTaskInstanceStatusEnum的参数类型从InstanceTaskDto改为String(对应DTO的status字段类型),返回类型从Enum<TaskStatusEnum>改为TaskStatusEnum,确保与映射字段的类型完全匹配:@Named("getTaskInstanceStatusEnum") default TaskStatusEnum getTaskInstanceStatusEnum(String statusStr) { if(statusStr == null) return null; for (TaskStatusEnum status : TaskStatusEnum.values()) { if (status.getValue().equals(statusStr)) { return status; } } // 未匹配到枚举时的默认处理,可根据业务需求调整(比如抛异常) return TaskStatusEnum.TO_DO; }保持原有映射配置不变
原有的@Mapping配置无需修改,确保source指向DTO的status字段,qualifiedByName正确关联自定义方法:@Mappings({ @Mapping(target = "status" , source = "status", qualifiedByName = "getTaskInstanceStatusEnum"), }) InstanceTask toEntity (InstanceTaskDto instanceTaskDto);
原因说明
MapStruct匹配自定义转换器时会严格校验参数类型与返回类型:之前的自定义方法接收的是InstanceTaskDto对象,但映射中指定的source是DTO的status字段(String类型),两者类型不匹配,MapStruct无法识别该方法为对应字段的转换器,因此自动使用了String转Enum的默认实现(Enum.valueOf)。修正方法参数类型后,MapStruct就能匹配到对应转换器,从而调用自定义逻辑。
内容的提问来源于stack exchange,提问作者Solaire
相关产品推荐
相关产品推荐

