有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么是javax。在将Yasson与JSONB一起使用时,Glassfish中的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>

前两个对我来说很有意义

➥ 但是,第三种依赖,来自Glassfishjavax.json到底给党带来了什么?为什么我的应用程序需要它才能工作

如果省略,当运行Jsonb jsonb = JsonbBuilder.create();时,我会得到以下错误:

javax.json.JsonException: Provider org.glassfish.json.JsonProviderImpl not found

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


共 (1) 个答案

  1. # 1 楼答案

    实际上,您的代码应该只依赖于api jakarta.json.bind-api,这样您就不会意外地使用来自yasson的实现细节,例如内部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正在寻找的后备实现