JSON-B выполняет сериализацию NPE с помощью адаптера, хотя устанавливает значение NullValues ​​(true) - PullRequest
0 голосов
/ 25 октября 2018

Проблема

В руководстве пользователя JSON-B здесь предлагается, чтобы я мог сериализовать null значения с моим кодом:

    Jsonb jsonb = JsonbBuilder.create(new JsonbConfig()
            .withNullValues(true)
            .withAdapters(new StatusAdapter()));

    jsonb.toJson(status,Status.class);

Здесь StatusAdapter - мой собственный JsonbAdapter , предназначенный для сериализации класса приложения Status , и выглядит примерно так:

StatusAdapter

@Override
public JsonObject adaptToJson(Status status) throws Exception {

   // ... 

   return Json.createObjectBuilder()

            .add("field1", status.getField1())               
            .add("field2", status.getField2())               

             // ... continues ...

            .build();

Но когда один из этих методов получения возвращает null, я получаю исключения, такие как:

Причина: java.lang.NullPointerException: значение в паре имя / значение JsonObjects не может быть нулевым в org.glassfish.json.JsonObjectBuilderImpl.validateValue (JsonObjectBuilderImpl.java:222) в org.glassfish.json.JsonObjectBuilderImpl.add (JsonObjectBuilderImpl.java:90.adaptToJson (StatusAdapter.java:14) в org.eclipse.yasson.internal.serializer.AdaptedObjectSerializer.serialize (AdaptedObjectSerializer.java:103)

pom.xml

Я использовал лatest версии зависимостей Maven со страницы JSON-B Getting Started :

            <dependency>
                    <groupId>javax.json.bind</groupId>
                    <artifactId>javax.json.bind-api</artifactId>
                    <version>1.0</version>
            </dependency>

            <dependency>
                    <groupId>org.eclipse</groupId>
                    <artifactId>yasson</artifactId>
                    <version>1.0.2</version>
            </dependency>

            <dependency>
                    <groupId>org.glassfish</groupId>
                    <artifactId>javax.json</artifactId>
                    <version>1.1.3</version>
            </dependency>

Вопрос

Итак, я неправильно понимаю API?Или это неправильная комбинация библиотек, связанных с JSON?Ошибка в одном из них?

Я тоже понимаю, что сериализация null может оставить меня со второй проблемой, когда пришло время десериализовать его.Я собираюсь использовать JSON-B для десериализации позже, если это поможет направить ответ.Спасибо.

Обновление:

Эта проблема yasson предполагает, что это может быть ошибкой.Добавил больше подробностей там.

1 Ответ

0 голосов
/ 02 ноября 2018

Исключение, которое вы получаете, в основном говорит о том, что вы не можете передать нуль в метод JsonObjectBuilder # add, который генерируется реализацией JSONP org.glassfish:javax.json.

Установка JsonbConfig#withNullValues(true) не относится к нему.

JSONB и JSONP - это два разных API, даже если JSONB зависит от JSONP.org.eclipse:yasson - это реализация JSONB API, которая в вашем случае использует org.glassfish:javax.json - реализацию JSONP API, потому что вы предоставили ее в своем POM.

Установка JsonbConfig#withNullValues(true) - это вызов JSONB API, которыйозначает "выводить нулевые значения в JSON" , например:

{ firstname: null, lastname: null }

Поэтому, когда org.eclipse:yasson (JSONB) встречает нулевое значение в свойстве объекта pojoон делает что-то вроде javax.json.stream.JsonGenerator#writeNull(key).

Это никак не связано с вашим кодом в StatusAdapter, который в основном вызывает JSONP API JsonObjectBuilder#add с нулевым значением, что недопустимо.

...