记一次由于修改了es对象字段类型,导致springboot项目启动不了的问题

一、项目背景

springboot整合es,然后用到了ElasticsearchRepository接口,这个接口的作用是可以实现对es进行简单的增删改查操作,它的用法类似于这样:

public interface UniAccountRepository extends ElasticsearchRepository<UniAccount,String> {
}
@NoRepositoryBean
public interface ElasticsearchRepository<T, ID extends Serializable> extends ElasticsearchCrudRepository<T, ID> {
	<S extends T> S index(S entity);
	Iterable<T> search(QueryBuilder query);
	Page<T> search(QueryBuilder query, Pageable pageable);
	Page<T> search(SearchQuery searchQuery);
	Page<T> searchSimilar(T entity, String[] fields, Pageable pageable);
	void refresh();
	Class<T> getEntityClass();
}
@Document(indexName = "uniuseraccount",type = "docs", shards = 1, replicas = 0)
public class UniAccount implements Serializable{
	private static final long serialVersionUID = -574424362819238356L;
	@Field(type = FieldType.keyword)
	private Long accountId;
    @Id
    private String staffCode;
}

接口提供简单查询方法,泛型第一个参数是Model对象,同时也是项目启动时spring自动简历索引时用到的对象,第二个参数是索引的、自己指定ID。

二、问题发现及原因

项目启动到这就自动退出了,根据以往的经验,以为是mybatis的mapper文件有错误导致的,跟了代码检查了提交记录发现没有问题,然后推测问题出现在es上,于是就跟了一下TransportClientFactoryBean的源码。

因为没有任何异常信息打印出来,所以一步一步跟代码后来发现了异常信息被throw出来。

es在建立索引的时候会同时建立mapping关系,并且mapping一旦建好是不能修改的(可以新增),看图中的异常信息可以知道问题出在了springboot项目启动的时候,去建立索引的时候发现跟mapping匹配不上,应该是string类型(keyword),实际上的model中(也就上一中的UniAccount)字段的类型是date所以导致了错误

springboot是通过@EnableElasticsearchRepositories注解来自动建立索引的,用法是在启动类上加上注解,然后注解有个属性是basePackages 用来指定Repository接口所在的包,然后会自动根据泛型的Model类,建立好index。

我的问题就是出现在第二次修改字段的时候,第一次新增字段的时候,spring会往mapping中加入我们新加的字段的信息,然后第二次我把字段改了从string改成了date,然而mapping却改不了,再次启动项目,建立索引的时候,发现mapping跟我的字段类型不一致了,于是就报错了。关键点就在于es的索引的mapping改不了这一个特性

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值