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

проблема

Руководство пользователя 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.jl_ImpIbB:90) в mypkg.StatusAdapter.adaptToJson(StatusAdapter.java:47) в mypkg.StatusAdapter.adaptToJson(StatusAdapter.java:14) в org.eclipse.yasson.internal.serializer.AdaptedObjectSerial3.jpg

pom.xml

Я использовал последние версии зависимостей Maven со страницы " Приступая к работе с JSON-B":

            <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 для десериализации позже, если это поможет направить ответ. Спасибо.

Обновить:

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

1 ответ

Решение

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

настройка JsonbConfig#withNullValues(true) не относится к этому.

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

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

{ firstname: null, lastname: null }

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

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

Другие вопросы по тегам