spring-data-elasticsearch @Field注解無效的完美解決方案
前言
我看了一大堆博客和資料大多是說這個(gè)spring的bug, 然后通過一個(gè).json的配置文件去加載,我也是真的笑了, 本來注解就是方便開發(fā),取消配置文件的功能, 結(jié)果解決方案卻是本末倒置, 這里我奉獻(xiàn)出最正確的解決方案
一. 準(zhǔn)備實(shí)例代碼
這是實(shí)體類代碼,及其注解
package com.gupao.springbootdemo.bean; import lombok.Data; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType; import java.util.List; /** * 功能描述:ES的用戶 * * @Author: zhouzhou * @Date: 2020/7/30$ 9:57$ */ @Data @Document(indexName = "es_user") public class ESUser { @Id private Long id; @Field(type = FieldType.Text) private String name; @Field(type = FieldType.Integer) private Integer age; @Field(type = FieldType.Keyword) private List<String> tags; @Field(type = FieldType.Text, analyzer = "ik_max_word") private String desc; }
這是創(chuàng)建索引的代碼
boolean index = elasticsearchRestTemplate.createIndex(ESUser.class);
我們會(huì)發(fā)現(xiàn),當(dāng)執(zhí)行后, 雖然執(zhí)行成功, 但是我們?nèi)ゲ榭此饕畔⒌臅r(shí)候發(fā)現(xiàn)沒有mapping信息
二. 解決方案
1.在createIndex方法后加putMapping方法
boolean index = elasticsearchRestTemplate.createIndex(ESUser.class); elasticsearchRestTemplate.putMapping(ESUser.class);
問題解決,查看mapping信息就有了
2.更新版本(注: 版本更新對(duì)應(yīng)要更新es版本到7.8以上,不建議!!)
項(xiàng)目啟動(dòng)的時(shí)候,自動(dòng)創(chuàng)建索引,無需手動(dòng)調(diào)用API創(chuàng)建!!!
三. 解決思路(源碼部分,以下只是筆者解決過程)
筆者通過查看elasticsearcRestTemplate的源碼才發(fā)現(xiàn)
@Override public ElasticsearchPersistentEntity getPersistentEntityFor(Class clazz) { Assert.isTrue(clazz.isAnnotationPresent(Document.class), "Unable to identify index name. " + clazz.getSimpleName() + " is not a Document. Make sure the document class is annotated with @Document(indexName=\"foo\")"); return elasticsearchConverter.getMappingContext().getRequiredPersistentEntity(clazz); }
創(chuàng)建索引前會(huì)通過getMappingContext方法獲取mappingContext字段, 但是這個(gè)字段怎么賦值呢?
沒有頭緒!!!!!
筆者又轉(zhuǎn)念一想, 我們直接思考下, 我們找到@Field字段在哪里被解析, 這不就知道讀取@Field的類和設(shè)置mappingContext的方法了!!!!
妙 啊!!!!!!
原來是
MappingBuilder這個(gè)類對(duì)@Field進(jìn)行解析, 后來進(jìn)去發(fā)現(xiàn)@Mapping解析.json,也就是網(wǎng)上的方法解析方法也在里面, 哈哈殊途同歸, 對(duì)外提供的方法為:
看注釋, 我就知道離真相不遠(yuǎn)了,繼續(xù)查看調(diào)用鏈, 真相大白!!!下面方法我就不多做解釋了
原來是這個(gè)putMapping這個(gè)方法啊,找了你好久!!!!
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot+redis自定義注解實(shí)現(xiàn)發(fā)布訂閱的實(shí)現(xiàn)代碼
在Redis中客戶端可以通過訂閱特定的頻道來接收發(fā)送至該頻道的消息,本文主要介紹了springboot+redis自定義注解實(shí)現(xiàn)發(fā)布訂閱,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08mybatis如何使用Criteria的and和or進(jìn)行聯(lián)合查詢
這篇文章主要介紹了mybatis如何使用Criteria的and和or進(jìn)行聯(lián)合查詢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Mybatis注解sql時(shí)出現(xiàn)的一個(gè)錯(cuò)誤及解決
這篇文章主要介紹了Mybatis注解sql時(shí)出現(xiàn)的一個(gè)錯(cuò)誤及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(33)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你2021-07-07Mapper類中存在名稱相同的方法重載報(bào)錯(cuò)問題
這篇文章主要介紹了Mapper類中存在名稱相同的方法重載報(bào)錯(cuò)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03MyBatis-Plus 動(dòng)態(tài)表名SQL解析器的實(shí)現(xiàn)
這篇文章主要介紹了MyBatis-Plus 動(dòng)態(tài)表名SQL解析器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08