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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:55:01