Почему javax.json из Glassfish необходим в качестве зависимости при использовании Yasson с JSON-B?
Чтобы использовать Java API для привязки JSON (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
API-интерфейс JSON-B, определенный в JSR 367yasson
является эталонной реализацией этого API, Eclipse Yasson.
➥ Но что именно делает третья зависимость, javax.json
из Glassfish, принести на вечеринку? Почему для работы моего приложения требуется?
Если опущено, при запуске Jsonb jsonb = JsonbBuilder.create();
Я получаю эту ошибку:
javax.json.JsonException: поставщик org.glassfish.json.JsonProviderImpl не найден
Я запутался, потому что думал, что Yasson - это моя реализация обработки JSON.
0 ответов
На самом деле ваш код должен зависеть только от 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.