spring-data-elasticsearch @Field注解无效的完美解决方案

前言

我看了一大堆博客和资料大多是说这个spring的bug, 然后通过一个.json的配置文件去加载,我也是真的笑了, 本来注解就是方便开发,取消配置文件的功能, 结果解决方案却是本末倒置, 这里我奉献出最正确的解决方案

一. 准备实例代码

这是实体类代码,及其注解

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;
}

这是创建索引的代码

boolean index = elasticsearchRestTemplate.createIndex(ESUser.class);

我们会发现,当执行后, 虽然执行成功, 但是我们去查看索引信息的时候发现没有mapping信息

二. 解决方案

1.在createIndex方法后加putMapping方法

boolean index = elasticsearchRestTemplate.createIndex(ESUser.class);
elasticsearchRestTemplate.putMapping(ESUser.class);

问题解决,查看mapping信息就有了

2.更新版本(注: 版本更新对应要更新es版本到7.8以上,不建议!!)

项目启动的时候,自动创建索引,无需手动调用API创建!!!

三. 解决思路(源码部分,以下只是笔者解决过程)

笔者通过查看elasticsearcRestTemplate的源码才发现

@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);
	}

创建索引前会通过getMappingContext方法获取mappingContext字段, 但是这个字段怎么赋值呢?

没有头绪!!!!!

笔者又转念一想, 我们直接思考下, 我们找到@Field字段在哪里被解析, 这不就知道读取@Field的类和设置mappingContext的方法了!!!!

妙 啊!!!!!!

原来是

MappingBuilder这个类对@Field进行解析, 后来进去发现@Mapping解析.json,也就是网上的方法解析方法也在里面, 哈哈殊途同归, 对外提供的方法为:

看注释, 我就知道离真相不远了,继续查看调用链, 真相大白!!!下面方法我就不多做解释了

原来是这个putMapping这个方法啊,找了你好久!!!!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Elasticsearch使用常见问题解决方案

    一.和redis一起使用会造成netty启动冲突问题,所以需要在***Application入口文件中添加方法: @PostConstruct public void init() { // see Netty4Utils.setAvailableProcessors() System.setProperty("es.set.netty.runtime.available.processors", "false"); } 二.NoNodeAvailableExcep

  • Spring data elasticsearch使用方法详解

    这篇文章主要介绍了Spring data elasticsearch使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.准备 1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> &l

  • Springboot集成spring data elasticsearch过程详解

    版本对照 各版本的文档说明:https://docs.spring.io/spring-data/elasticsearch/docs/ 1.在application.yml中添加配置 spring: data: elasticsearch: repositories: enabled: true #多实例集群扩展时需要配置以下两个参数 #cluster-name: datab-search #cluster-nodes: 127.0.0.1:9300,127.0.0.1:9301 2.添加 M

  • SpringBoot整合Spring Data Elasticsearch的过程详解

    Spring Data Elasticsearch提供了ElasticsearchTemplate工具类,实现了POJO与elasticsearch文档之间的映射 elasticsearch本质也是存储数据,它不支持事物,但是它的速度远比数据库快得多, 可以这样来对比elasticsearch和数据库 索引(indices)--------数据库(databases) 类型(type)------------数据表(table) 文档(Document)---------------- 行(ro

  • Lombok的@Data等注解无效的解决

    一.已定义好的实体类 二.调用时没有get,set访问器 在用@Data注解时,没有生成setter/getter方法.百度了一堆都没解决方法,后来用Google查了一下解决了~~~ 使用IDEA需要安装Lombok插件,我这里已经下载好,如果没下载安装点击install进行下载安装即可~~~ 到此这篇关于Lombok的@Data等注解无效的解决的文章就介绍到这了,更多相关Lombok的@Data注解无效内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

  • spring-data-elasticsearch @Field注解无效的完美解决方案

    前言 我看了一大堆博客和资料大多是说这个spring的bug, 然后通过一个.json的配置文件去加载,我也是真的笑了, 本来注解就是方便开发,取消配置文件的功能, 结果解决方案却是本末倒置, 这里我奉献出最正确的解决方案 一. 准备实例代码 这是实体类代码,及其注解 package com.gupao.springbootdemo.bean; import lombok.Data; import org.springframework.data.annotation.Id; import or

  • spring data jpa @Query注解中delete语句报错的解决

    目录 spring data jpa @Query注解中delete语句报错 项目中需要删除掉表中的一些数据 JPA使用@Query注解实例 1. 一个使用@Query注解的简单例子 2. Like表达式 3. 使用Native SQL Query 4. 使用@Param注解注入参数 5. SPEL表达式(使用时请参考最后的补充说明) 6. 一个较完整的例子 7. S模糊查询注意问题 8. 解释例6中错误的原因 spring data jpa @Query注解中delete语句报错 项目中需要删

  • Spring和SpringMVC扫描注解类冲突的解决方案

    目录 Spring和SpringMVC扫描注解类冲突 最正确的配置方式 也可以用直接扫描的方式 几种不同配置的测试 Spring和SpringMVC注解扫描注意事项 现象 方法 Spring和SpringMVC扫描注解类冲突 最正确的配置方式 在主容器中applicationContext.xml中,将Controller的注解排除掉 <context:component-scan base-package="com"> <context:exclude-filter

  • 基于Spring Data Jest的Elasticsearch数据统计示例

    命令查询职责分离模式(Command Query Responsibility Segregation,CQRS)从业务上分离修改 (Command,增,删,改,会对系统状态进行修改)和查询(Query,查,不会对系统状态进行修改)的行为.从而使得逻辑更加清晰,便于对不同部分进行针对性的优化. CQRS有以下几点有点: 1.分工明确,可以负责不同的部分: 2.将业务上的命令和查询的职责分离能够提高系统的性能.可扩展性和安全性.并且在系统的演化中能够保持高度的灵活性,能够防止出现CRUD模式中,对

  • Spring Data JPA框架快速入门之自定义Repository接口

    目录 自定义Repository接口 repository接口定义 使用Repository接口 自定义Repository接口 要定义一个repository接口,你首先需要自定义一个实体类专用的Repository接口.该接口必须扩展 Repository,并将其类型指定为实体类和实体类的 ID 类型. 如果你想为该实体类资源类型开放CRUD方法,请直接继承CrudRepository而不是Repository. repository接口定义 通常,你的repository接口会扩展Repo

  • 详解使用Spring Data repository进行数据层的访问问题

    目录 使用Spring Data repository进行数据层的访问 核心概念 查询方法 定义查询方法 CREATE USE_DECLARED_QUERY CREATE_IF_NOT_FOUND WEB支持 使用Spring Data repository进行数据层的访问 抽象出Spring Data repository是因为在开发过程中,常常会为了实现不同持久化存储的数据访问层而写大量的大同小异的代码. Spring Data repository的目的就是要大幅减少这些重复的代码. Sp

  • 浅谈Spring Data Redis读不到设进去的值

    目录 目标 1 注意读.取一致性 解析 AbstractOperations#rawKey 修正 目标 精通 Spring Data Redis 操作流程. Spring Data提供了对市场上主流数据库支持: Spring Data Commons Spring Data JPA Spring Data KeyValue Spring Data LDAP Spring Data MongoDB Spring Data Redis Spring Data REST Spring Data for

随机推荐