elasticsearch-java 8.10.4下划线字段转Java驼峰属性问题求助
解决方案
针对你使用elasticsearch-java 8.10.4(JDK 1.8环境)时,索引下划线字段无法映射到Java驼峰属性的问题,以下是几种可行的解决方式:
1. 字段级注解映射(快速适配单个类)
利用Jackson的@JsonProperty注解,在Java对象的驼峰属性上显式指定对应的索引下划线字段名,这是最直接的方式:
普通Java类示例
public class User { private String userId; private String model; // 为userId属性指定索引中的user_id字段 @JsonProperty("user_id") public String getUserId() { return userId; } @JsonProperty("user_id") public void setUserId(String userId) { this.userId = userId; } // 简单属性无需额外配置 public String getModel() { return model; } public void setModel(String model) { this.model = model; } }
Lombok简化示例
如果使用Lombok,可以直接在字段上添加注解,省去手动编写getter/setter:
import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; @Data public class User { @JsonProperty("user_id") private String userId; private String model; }
2. 全局配置Jackson命名策略(批量适配所有类)
通过自定义ObjectMapper开启下划线转驼峰的全局命名策略,避免每个字段都加注解:
步骤1:创建自定义ObjectMapper
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategy; ObjectMapper customMapper = new ObjectMapper(); // 设置下划线转驼峰的命名策略 customMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); // 可添加其他必要配置,比如日期格式、空值处理等
步骤2:配置ElasticsearchClient使用自定义Mapper
将自定义的ObjectMapper传入JacksonJsonpMapper,再配置到客户端中:
import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientTransport; import org.elasticsearch.client.json.jackson.JacksonJsonpMapper; import org.elasticsearch.client.transport.ElasticsearchClient; // 初始化RestClient RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build(); // 使用自定义ObjectMapper创建JacksonJsonpMapper JacksonJsonpMapper jsonpMapper = new JacksonJsonpMapper(customMapper); // 构建ElasticsearchClient ElasticsearchClient client = new ElasticsearchClient( new RestClientTransport(restClient, jsonpMapper) );
配置完成后,客户端会自动将索引中的下划线字段映射到Java对象的驼峰属性。
3. 手动解析Source Map(兜底方案)
如果上述自动映射方式都不适用,可以手动从SearchHit中取出source数据,手动赋值给Java对象:
import org.elasticsearch.client.core.SearchResponse; import org.elasticsearch.client.core.SearchHit; SearchResponse<User> response = client.search( s -> s.index("your_index_name").query(q -> q.matchAll(m -> m)), User.class ); for (SearchHit<User> hit : response.hits().hits()) { // 获取索引返回的原始字段Map Map<String, Object> source = hit.source(); User user = new User(); // 手动将下划线字段赋值给驼峰属性 user.setUserId((String) source.get("user_id")); user.setModel((String) source.get("model")); // 其他属性同理处理 }
内容的提问来源于stack exchange,提问作者Hsu Demon
相关产品推荐
相关产品推荐

