首页 > 解决方案 > 为什么在使用带有 JSON-B 的 Yasson 时需要来自 Glassfish 的 javax.json 作为依赖项?

问题描述

为了使用Java API for JSON Binding (JSON-B),我发现有必要在我的Maven POM中包含以下三个依赖项:

    <!-- https://mvnrepository.com/artifact/jakarta.json.bind/jakarta.json.bind-api -->
    <dependency>
        <groupId>jakarta.json.bind</groupId>
        <artifactId>jakarta.json.bind-api</artifactId>
        <version>1.0.1</version>

    </dependency>

    <!-- https://mvnrepository.com/artifact/org.eclipse/yasson -->
    <dependency>
        <groupId>org.eclipse</groupId>
        <artifactId>yasson</artifactId>
        <version>1.0.3</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.glassfish/javax.json -->
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.json</artifactId>
        <version>1.1.4</version>
    </dependency>

前两个对我来说很有意义。

javax.json➥ 但是来自Glassfish的第三个依赖项到底给聚会带来了什么?为什么我的应用程序需要它才能运行?

如果省略,在运行时Jsonb jsonb = JsonbBuilder.create();,我会收到此错误:

javax.json.JsonException:未找到提供程序 org.glassfish.json.JsonProviderImpl

我很困惑,因为我认为 Yasson我的 JSON 处理实现。

标签: javajakarta-eejsonb-apiyasson

解决方案


实际上,您的代码应该只依赖于 api jakarta.json.bind-api,因此您不会意外使用来自yasson的实现细节,例如 internal org.eclipse.yasson.internal.ReflectionUtils。为此,您应该添加<scope>runtime</scope>到您的yasson依赖项。只是为了运行它,您需要一个实现,并且您选择了参考实现yasson

JSON-B只是JSON-P之上的一层:它完成绑定部分,同时将所有原始 JSON 处理委托给 JSON-P。您可以将任何 JSON-B 实现与任何 JSON-P 实现混合和匹配。

由于yasson必须能够使用任何 JSON-P 实现,它不能对例如 Glassfish JSON-P 有硬依赖;你必须自己指定它(也有一个runtime范围)。您看到的错误消息提到了 Glassfish,因为这是 JSON-P 正在寻找的后备实现。


推荐阅读