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

ES 7.2使用Java High Level Rest Client映射查询结果至Java Bean遇问题

解决Jackson映射Elasticsearch大写字段到Java Bean的UnrecognizedPropertyException问题

你遇到的这个异常核心原因是Jackson默认的属性命名策略和Elasticsearch返回的JSON字段大小写不匹配——你的ES返回结果里是全大写的STATUS和SERVICE_ID,但Jackson自动推断的MyBean属性名是小写开头的status和service_ID,导致它识别不了这些大写字段。下面给你几种可行的解决办法:

方案一:使用@JsonProperty注解显式指定字段映射

这是最直接的方式,在MyBean类的字段或对应的getter/setter上添加@JsonProperty注解,明确绑定JSON中的字段名:

import com.fasterxml.jackson.annotation.JsonProperty;

public class MyBean {
    @JsonProperty("SERVICE_ID")
    String SERVICE_ID;
    
    @JsonProperty("STATUS")
    String STATUS;

    public String getSERVICE_ID() { return SERVICE_ID; }
    public void setSERVICE_ID(String sERVICE_ID) { SERVICE_ID = sERVICE_ID; }

    public String getSTATUS() { return STATUS; }
    public void setSTATUS(String sTATUS) { STATUS = sTATUS; }
}

添加注解后,Jackson就能精准把JSON里的大写字段映射到对应的Java属性上,不会再抛出未识别属性的异常。

方案二:配置ObjectMapper忽略属性大小写

如果你不想给每个字段都加注解,可以修改ObjectMapper的全局配置,让它在解析时忽略属性名的大小写:

try {
    SearchResponse searchResponse1 = client.search(searchRequest, RequestOptions.DEFAULT);
    ObjectMapper mapper = new ObjectMapper();
    // 开启属性名大小写不敏感匹配
    mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
    
    java.util.List<MyBean> lst = new ArrayList<MyBean>();
    for(SearchHit hit : searchResponse1.getHits().getHits()) {
        MyBean s = mapper.readValue(hit.getSourceAsString(), MyBean.class);
        lst.add(s);
    }
    // 后续业务逻辑处理
} catch (Exception e) {
    e.printStackTrace();
}

这个配置会让Jackson自动兼容JSON字段的大小写差异,适合字段数量较多、不想逐个加注解的场景。

补充说明

异常信息里提到的"2 known properties: "status", "service_ID"",是因为Jackson默认的PropertyNamingStrategy会把getSTATUS()推断为属性名status,把getSERVICE_ID()推断为service_ID,和ES返回的全大写字段完全不匹配,才触发了未识别属性的错误。上面两种方案都能解决这个命名匹配问题,你可以根据自己的代码场景选择合适的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:06:52