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>
前两个对我来说很有意义
jakarta.json.bind-api
是由JSR 367.定义的JSON-B APIyasson
是该API的参考实现Eclipse Yasson李>
➥ 但是,第三种依赖,来自Glassfish的javax.json
到底给党带来了什么?为什么我的应用程序需要它才能工作
如果省略,当运行Jsonb jsonb = JsonbBuilder.create();
时,我会得到以下错误:
javax.json.JsonException: Provider org.glassfish.json.JsonProviderImpl not found
我很困惑,因为我认为Yasson是我的JSON处理实现
# 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正在寻找的后备实现