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

如何使用MapStruct实现JsonNullable<Csp>到DTO中String属性的映射?

解决方案:MapStruct映射JsonNullable<枚举>到String属性

问题出在MapStruct默认无法自动处理JsonNullable<Csp>这种包装类型的枚举到String的转换,需要自定义转换逻辑来解包JsonNullable并处理枚举值。下面是两种可行的解决方案:


方案一:针对Csp枚举的专用转换器

  1. 编写自定义转换器类,处理JsonNullable<Csp>到String的转换:
public class JsonNullableCspConverter {
    public String convertToProfession(JsonNullable<Csp> cspNullable) {
        // 处理未定义或空的情况,按需返回null/空字符串
        if (cspNullable == null || cspNullable.isUndefined()) {
            return null;
        }
        // 这里返回枚举的name(),如果枚举有自定义编码字段,替换为csp.getCode()即可
        return cspNullable.get().name();
    }
}
  1. 在MapStruct接口中引入该转换器,或者在映射规则中指定:

方式A:通过uses全局引入

@Mapper(uses = JsonNullableCspConverter.class)
public interface AssureMapper {
    @Mapping(target = "assure", source = "assure", qualifiedByName = "toAssureDto")

    @Named("toAssureDto")
    @Mapping(target = "profession", source = "csp")
    AssureDto toDto(final AssureAuto entity);
}

方式B:通过qualifiedByName指定单个映射的转换器

先给转换器方法添加@Named注解:

public class JsonNullableCspConverter {
    @Named("cspToProfession")
    public String convertToProfession(JsonNullable<Csp> cspNullable) {
        if (cspNullable == null || cspNullable.isUndefined()) {
            return null;
        }
        return cspNullable.get().name();
    }
}

然后在映射规则中引用:

@Named("toAssureDto")
@Mapping(target = "profession", source = "csp", qualifiedByName = "cspToProfession")
AssureDto toDto(final AssureAuto entity);

方案二:通用枚举转换器(适用于多个JsonNullable枚举场景)

如果项目中有多个类似的JsonNullable<枚举>需要转换,可以写一个泛型转换器:

public class JsonNullableEnumConverter {
    public <E extends Enum<E>> String convertEnumToString(JsonNullable<E> enumNullable) {
        if (enumNullable == null || enumNullable.isUndefined()) {
            return null;
        }
        return enumNullable.get().name();
    }
}

同样通过@Mapper(uses = JsonNullableEnumConverter.class)引入,MapStruct会自动根据类型匹配对应的转换逻辑。


注意事项

  • 根据业务需求调整JsonNullable的空值处理逻辑(比如返回空字符串而非null)
  • 如果枚举需要输出的不是默认的name(),而是自定义的编码/描述字段,修改转换器中的返回语句即可
  • 确保使用的MapStruct版本在1.3.0及以上,该版本对自定义转换器的支持更完善

内容的提问来源于stack exchange,提问作者Olivier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 06:05:21