在将 Yasson 与 JSON-B 结合使用时,为什么需要 Glassfish 中的 javax.json 作为依赖项?

Bas*_*que 6 java jsonb-api jakarta-ee yasson

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

\n\n
    <!-- https://mvnrepository.com/artifact/jakarta.json.bind/jakarta.json.bind-api -->\n    <dependency>\n        <groupId>jakarta.json.bind</groupId>\n        <artifactId>jakarta.json.bind-api</artifactId>\n        <version>1.0.1</version>\n\n    </dependency>\n\n    <!-- https://mvnrepository.com/artifact/org.eclipse/yasson -->\n    <dependency>\n        <groupId>org.eclipse</groupId>\n        <artifactId>yasson</artifactId>\n        <version>1.0.3</version>\n    </dependency>\n\n    <!-- https://mvnrepository.com/artifact/org.glassfish/javax.json -->\n    <dependency>\n        <groupId>org.glassfish</groupId>\n        <artifactId>javax.json</artifactId>\n        <version>1.1.4</version>\n    </dependency>\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n\n\n

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

\n\n

如果省略,运行时Jsonb jsonb = JsonbBuilder.create();会出现此错误:

\n\n
\n

javax.json.JsonException:找不到提供者 org.glassfish.json.JsonProviderImpl

\n
\n\n

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

\n

rü-*_*rü- 4

实际上,您的代码应该只依赖于 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 正在寻找的后备实现。