java - 为什么在使用带有 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>
前两个对我来说很有意义。
jakarta.json.bind-api
是JSR 367定义的JSON-B API 。yasson
是该 API 的参考实现,Eclipse Yasson。
javax.json
➥ 但是来自Glassfish的第三个依赖项到底给聚会带来了什么?为什么我的应用程序需要它才能运行?
如果省略,在运行时Jsonb jsonb = JsonbBuilder.create();
,我会收到此错误:
javax.json.JsonException:未找到提供程序 org.glassfish.json.JsonProviderImpl
我很困惑,因为我认为 Yasson是我的 JSON 处理实现。
解决方案
实际上,您的代码应该只依赖于 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 正在寻找的后备实现。
推荐阅读
- sql - Rails:如何使用递归(Postgresql)查询父类别的所有子类别,然后查询其子类别等
- python - 默认参数:计算在用餐者之间拆分支票
- javascript - 如何检测碰撞?
- typescript - 元素 UI 包括所有组件。制作大包大小
- php - 在php中将表格数据渲染为pdf
- python - Numpy python数组切片
- php - 如何通过 PHP 中的回显获取要在 HTML 中输出的变量
- java - 在主要活动上按后退按钮打开其他活动
- android - 最近更新后,pug get 无法正常工作。有任何想法吗?
- php - 仅在前端将搜索结果限制为 WooCommerce 产品