Аннотации JSON Binding @JsonbTypeDeserializer игнорируются в перечислениях?
Я конвертирую приложение 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
не используется. Вместо этого используется десериализатор перечисления по умолчанию. Заглянув в документы JSON-B, я вижу, что нужно зарегистрировать десериализатор вручную:
JsonbConfig config = new JsonbConfig()
.withDeserializer(RegionDeserializer.class);
Jsonb jsonb = JsonbBuilder.create(config);
...
И когда я это делаю, код действительно работает. Но вот мой вопрос - что я могу сделать, чтобыJsonbTypeDeserializer
аннотация регистрируется автоматически? Учитывая, что у меня много перечислений, для которых мне нужны специальные десериализаторы, их ручная регистрация действительно не масштабируется.
РЕДАКТИРОВАТЬ 1: я пытался использовать@JsonbCreator
-аннотированный статический метод, и результат был таким же. Десериализатор перечисления по умолчанию все еще использовался.
1 ответ
В спецификации JSON-B упоминаются оба способа регистрации настраиваемого десериализатора:
Есть два способа зарегистрировать JsonbSerializer/JsonbDeserializer:
- С помощью
JsonbConfig::withSerializers
/JsonbConfig::withDeserializers
метод;- Аннотирование типа с помощью
JsonbSerializer
/JsonbDeserializer
аннотация.
То, что аннотация не работает - это ошибка. Я мог воспроизвести это на Yasson 1.0.6, но не на Yasson 2.0.0-M1. Возможно, обновление до последней версии решит вашу проблему?