JSON Связывание аннотации @JsonbTypeDeserializer игнорируется в перечислениях? - PullRequest
1 голос
/ 07 марта 2020

Я преобразую приложение JAXB в JSON -B и столкнулся с проблемой при попытке десериализации перечисления Java с использованием пользовательского JsonbDeserializer в одном из моих тестов .

Оригинал JSON, который мне нужно десериализовать, содержит int s, ссылающихся на константы перечисления. Поэтому мой пользовательский JsonbDeserializer должен взять int и вернуть константу перечисления с совпадающим ordinal. Это выглядит так:

@JsonbTypeDeserializer(Region.RegionDeserializer.class)
public enum Region implements BaseEnum {

    REGION_A,
    REGION_B;

    static final class RegionDeserializer implements JsonbDeserializer<Region> {

        // deserialize() method returns REGION_A for 0 and REGION_B for 1.

    }
}

Затем я запускаю это так:

try (var jsonb = JsonbBuilder.create()) {
    var result = jsonb.fromJson(text, Region.class);
} catch (final Exception ex) {
    fail(ex);
}

К сожалению, вот что я получаю обратно:

java.lang.IllegalArgumentException: No enum constant Region.1
    at java.base/java.lang.Enum.valueOf(Enum.java:266)
    at org.eclipse.yasson.internal.serializer.EnumTypeDeserializer.deserialize(EnumTypeDeserializer.java:40)

Как вы можете видите, RegionDeserializer не используется. Вместо этого используется десериализатор enum по умолчанию. Просматривая документы JSON -B, я вижу, что мне нужно зарегистрировать десериализатор вручную:

JsonbConfig config = new JsonbConfig()
    .withDeserializer(RegionDeserializer.class);
Jsonb jsonb = JsonbBuilder.create(config);
...

И когда я это делаю, код фактически работает. Но вот мой вопрос - что я могу сделать, чтобы аннотация JsonbTypeDeserializer была зарегистрирована автоматически? Учитывая, что у меня много перечислений, для которых мне нужны пользовательские десериализаторы, регистрация их вручную действительно не масштабируется.

РЕДАКТИРОВАТЬ 1: Я пытался использовать @JsonbCreator -аннотированные данные c метод вместо, и результат был тот же. Десериализатор enum по умолчанию все еще использовался.

1 Ответ

0 голосов
/ 24 апреля 2020

В спецификации JSON -B упоминаются оба способа регистрации пользовательского десериализатора:

Существует два способа регистрации JsonbSerializer / JsonbDeserializer:

  • Использование JsonbConfig::withSerializers / JsonbConfig::withDeserializers метод;
  • Аннотирование типа с аннотацией JsonbSerializer / JsonbDeserializer.

Тот факт, что аннотация не работает, является ошибкой , Я мог бы воспроизвести это на Yasson 1.0.6, но не на Yasson 2.0.0-M1. Возможно, обновление до последней версии решит вашу проблему?

...