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
相关产品推荐
相关产品推荐

