Почему javax.json из Glassfish необходим в качестве зависимости при использовании Yasson с JSON-B? - PullRequest
1 голос
/ 08 мая 2019

Чтобы использовать 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>

Первые два имеют смысл для меня.

➥ Но что именно третья зависимость, javax.json из Glassfish , приносит на вечеринку? Почему требуется, чтобы мое приложение работало?

Если опущено, при запуске Jsonb jsonb = JsonbBuilder.create(); я получаю эту ошибку:

javax.json.JsonException: поставщик org.glassfish.json.JsonProviderImpl не найден

Я запутался, потому что думал, что Yasson - это моя реализация обработки JSON.

1 Ответ

1 голос
/ 15 июня 2019

На самом деле, ваш код должен зависеть только от 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.

...