如何使用MapStruct实现JsonNullable<Csp>到DTO中String属性的映射?
解决方案:MapStruct映射JsonNullable<枚举>到String属性
问题出在MapStruct默认无法自动处理JsonNullable<Csp>这种包装类型的枚举到String的转换,需要自定义转换逻辑来解包JsonNullable并处理枚举值。下面是两种可行的解决方案:
方案一:针对Csp枚举的专用转换器
- 编写自定义转换器类,处理
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(); } }
- 在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
相关产品推荐
相关产品推荐

