Elasticsearch新旧客户端SortOrder枚举映射问题咨询
解决Elasticsearch新版Java Api Client与旧版SortOrder枚举的MapStruct映射问题
针对新旧Elasticsearch客户端SortOrder枚举大小写不匹配的问题,这里提供几种MapStruct的解决方式:
方法一:直接使用@ValueMapping注解手动映射
这是最直观的方案,针对每个枚举常量明确指定映射关系:
@Mapper public interface SortOrderMapper { SortOrderMapper INSTANCE = Mappers.getMapper(SortOrderMapper.class); @ValueMapping(source = "ASC", target = "Asc") @ValueMapping(source = "DESC", target = "Desc") co.elastic.clients.elasticsearch._types.SortOrder toModel(com.your.package.SortOrder sortOrder); // 如果需要反向映射(新版转旧版),添加以下方法 @ValueMapping(source = "Asc", target = "ASC") @ValueMapping(source = "Desc", target = "DESC") com.your.package.SortOrder toApi(co.elastic.clients.elasticsearch._types.SortOrder sortOrder); }
方法二:自定义转换方法处理大小写
如果后续可能新增枚举值且命名规则一致(旧版全大写,新版首字母大写其余小写),可以用自定义转换逻辑统一处理:
@Mapper public interface SortOrderMapper { SortOrderMapper INSTANCE = Mappers.getMapper(SortOrderMapper.class); default co.elastic.clients.elasticsearch._types.SortOrder toModel(com.your.package.SortOrder sortOrder) { if (sortOrder == null) { return null; } // 将旧版全大写枚举名转换为首字母大写、其余小写的格式,再匹配新版枚举 String targetName = sortOrder.name().substring(0, 1).toUpperCase() + sortOrder.name().substring(1).toLowerCase(); return co.elastic.clients.elasticsearch._types.SortOrder.valueOf(targetName); } // 反向映射同理 default com.your.package.SortOrder toApi(co.elastic.clients.elasticsearch._types.SortOrder sortOrder) { if (sortOrder == null) { return null; } return com.your.package.SortOrder.valueOf(sortOrder.name().toUpperCase()); } }
方法三:使用switch语句显式转换
这种方式逻辑清晰,适合需要额外判断逻辑的场景:
@Mapper public interface SortOrderMapper { SortOrderMapper INSTANCE = Mappers.getMapper(SortOrderMapper.class); default co.elastic.clients.elasticsearch._types.SortOrder toModel(com.your.package.SortOrder sortOrder) { if (sortOrder == null) { return null; } return switch (sortOrder) { case ASC -> co.elastic.clients.elasticsearch._types.SortOrder.Asc; case DESC -> co.elastic.clients.elasticsearch._types.SortOrder.Desc; }; } }
选择哪种方案取决于你的枚举数量、命名规则稳定性以及是否需要额外逻辑,第一种方案在枚举值较少时最简洁可靠。
内容的提问来源于stack exchange,提问作者Murat K.
相关产品推荐
相关产品推荐

