ClassNotFoundException: com.fasterxml.jackson.core.util.JacksonFeature in Spring boot, elasticsearch

 我的解决方法:

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.17.0</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
                <version>2.17.0</version>
            </dependency>
            <dependency>
                <groupId>jakarta.json</groupId>
                <artifactId>jakarta.json-api</artifactId>
                <version>2.0.1</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

使用  dependencyManagement  覆盖SpringBoot原有版本即可。


原文链接ClassNotFoundException: com.fasterxml.jackson.core.util.JacksonFeature in Spring boot, upgrading from Elasticsearch HLRC to Java API Client

我想用 Elasticsearch 的新 Java API 客户端替换已经废弃的 High Level Rest Client。问题是,我不确定我的依赖项配置是否正确!我遇到了这个错误:

java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/util/JacksonFeature
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.core.util.JacksonFeature

Elasticsearch 刚刚升级到7.17.3,SpringBoot 现在是2.2.8,稍后会升级,但我不确定这是否是问题所在?以下是我在pom中的依赖关系:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-webmvc-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-ui</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>co.elastic.clients</groupId>
            <artifactId>elasticsearch-java</artifactId>
            <version>7.17.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.13.2</version>
        </dependency>
        <dependency>
            <groupId>jakarta.json</groupId>
            <artifactId>jakarta.json-api</artifactId>
            <version>2.1.0</version>
        </dependency>
    </dependencies>

我在这里参考了 Elasticsearch here 所以我也试用了 jackson-database 的2.12.3版本,但是错误依然存在。有什么应该改变的想法吗?谢谢!

编辑: 为了以防万一,这里还有我的客户端,它是需要依赖关系的地方(我假设)

@Configuration
public class ElasticsearchClient{

   RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
   ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
   public ElasticsearchClient client = new ElasticsearchClient(transport);
}

(我不得不把public放在client面前,因为它位于另一个包裹之下,不然无法调用)

看了更多信息后: 原来有一个parent,它将加载一个旧的jackson-databind,所以我做了以下(为了解决版本冲突的问题,排除parent特定的jackson-databind版本,然后显式地添加另一个版本的jackson-databind作为依赖。)

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-schema-registry-client</artifactId>
            <exclusions>
                <exclusion> 
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                </exclusion>
            </exclusions>
</dependency>
<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.3</version>
</dependency>

还是没用,所以我现在200%没主意了

添加一个 jackson-core 包解决了。(jackson-core和jackson-databind版本一致)

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.12.3</version>
</dependency>

下面这是我自己的依赖:添加了与jackson-databind版本一致的 jackson-core 2.17.0版本

官网上是这样说的:

如果出现 ClassNotFoundException:jakarta.json.spi.JsonProvider

设置依赖项后,您的应用程序可能会失败ClassNotFoundException: jakarta.json.spi.JsonProvider

如果发生这种情况,您必须明确添加jakarta.json:jakarta.json-api:2.0.1依赖项。

为什么需要这样做?

Spring Boot 或 Helidon 等一些框架附带 Gradle 和 Maven 插件或 Maven BOM 文件,以简化开发和依赖项管理。这些插件和 BOM 定义了许多知名库要使用的版本。

其中一个库可以jakarta.json:json-api定义标准 Java JSON API。在 2010 版中,1.x该库使用了javax.json包,而在 2011 版中,2.x它使用了从 JavaEE 过渡到 JakartaEEjakarta.json后的 包。

Java API 客户端依赖2.0.1于此库的版本,以便使用较新且面向未来的jakarta.json软件包。但某些构建插件和 BOM 会覆盖 Java API 客户端的依赖关系,以使用1.x较旧命名空间中的版本javax.json,从而导致ClassNotFoundException: jakarta.json.spi.JsonProvider

添加正确的版本作为顶级项目依赖项可以解决问题。

如果你的应用程序也需要javax.json你可以添加javax.json:javax.json-api:1.1.4依赖项,这相当于jakarta.json:jakarta.json-api:1.1.6


原因:github仓库里可以看到这个类是在2.12版本之后

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JAVA技术开发员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值