Я преобразую приложение 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 по умолчанию все еще использовался.