在将文档保存到ES索引时,我在迁移到Sprringboot2.7.15之后遇到了这个问题.

2023-10-04 13:23:01 [pool-2-thread-10] ERROR o.s.s.s.TaskUtils$LoggingErrorHandler -
                Unexpected error occurred in scheduled task
java.lang.NoSuchFieldError: INDEX_CONTENT_TYPE
    at org.springframework.data.elasticsearch.core.RequestFactory.indexRequest(RequestFactory.java:771)
    at org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate.doIndex(ElasticsearchRestTemplate.java:156)
    at org.springframework.data.elasticsearch.core.AbstractElasticsearchTemplate.save(AbstractElasticsearchTemplate.java:189)
    at org.springframework.data.elasticsearch.repository.support.SimpleElasticsearchRepository.lambda$save$6(SimpleElasticsearchRepository.java:185)
    at org.springframework.data.elasticsearch.repository.support.SimpleElasticsearchRepository.executeAndRefresh(SimpleElasticsearchRepository.java:359)
    at org.springframework.data.elasticsearch.repository.support.SimpleElasticsearchRepository.save(SimpleElasticsearchRepository.java:185)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
    at java.base/java.lang.reflect.Method.invoke(Method.java:578)
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:289)
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137)
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121)
    at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:530)
    at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:286)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:640)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:164)
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:139)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:241)
    at jdk.proxy2/jdk.proxy2.$Proxy100.save(Unknown Source)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
    at java.base/java.lang.reflect.Method.invoke(Method.java:578)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:241)
    at jdk.proxy2/jdk.proxy2.$Proxy100.save(Unknown Source)

通过更改为SpringBoot-starter-data-ElasticSearch,它修复了该问题.那么,这两个依赖项之间有什么区别呢

推荐答案

spring-data-elasticsearch是对Spring数据的Elasticearch支持,它并不特定地绑定到Spring Boot.

spring-boot-starter-data-elasticsearch是Spring Boot启动器,它配置/设置Spring Boot以使用带有Spring数据的Elasticearch(其中包括spring-data-elasticsearch作为其依赖项之一).

换句话说,当您使用spring-boot-starter-data-elasticsearch时,您的also使用spring-data-elasticsearch,但是启动器确保您还具有在Spring Boot中正常工作所需的任何其他依赖项.

然而,考虑到您问题中的错误,我怀疑主要问题是您依赖于错误的spring-data-elasticsearch版本.NoSuchFieldError通常表示代码是针对另一个依赖项的不同版本进行编译的,如果该代码发生更改(例如,字段被移除或重命名),则它将在运行时失败.当您切换到spring-boot-starter-data-elasticsearch时,它导入了正确版本的spring-data-elasticsearch依赖项,问题就消失了.

当您使用Spring Boot时,通常不应该在Maven或Gradle配置中指定依赖项的版本,而应该使用由Spring Boot管理的版本.只有不是由Spring Boot管理的依赖项才应该在您的构建配置中有一个版本(有关由Spring Boot管理的依赖项列表,请参见Dependency Versions)

Java相关问答推荐

Spring bootstrap @ Asmat注释与@ Routed

我们如何直接使用kerminldap服务票证来通过ldap进行身份验证并形成LDAP上下文

Jooq隐式地将bigint转换为数字,并且索引不起作用

Android视图覆盖不阻止点击它后面的控件

BiPredicate和如何使用它

路径映射未发生

如何获得执行人?

为什么JAVA&S清洁器使用链表而不是并发HashSet?

使用Spring Boot3.2和虚拟线程的并行服务调用

使用GridBagLayout正确渲染

在Spring Boot中使用哪个Java类来存储创建时间戳?

在Java中如何从Executors.newFixedThreadPool(MAX_THREAD_COUNT())迁移到虚拟线程

当Volatile关键字真的是必要的时候?

Cordova Android Gradle内部版本组件不兼容

FETCH类型设置为LAZY,但它仍会发送第二个请求

无法将GSON导入到我的JavaFX Maven项目

Java.time.OffsetDateTime的SQL Server数据库列类型是什么?

在Java中将对象&转换为&q;HashMap(&Q)

基于距离的APACHE POI公式判断

为什么我得到默认方法的值而不是被覆盖的方法的值?