枚举是否忽略了JSON绑定@JsonbTypeDeserializer注释?

问题描述 投票:0回答:1

我将一个JAXB应用程序转换为JSON-B,并且在我的一个测试中尝试使用自定义JsonbDeserializer对Java枚举进行反序列化时遇到了一个问题。

我需要反序列化的原始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注释的静态方法,结果是相同的。默认的枚举解串器仍在使用。

java resteasy jsonb-api yasson
1个回答
0
投票

JSON-B规范提到了注册自定义解串器的两种方法:

有两种方法注册JsonbSerializer / JsonbDeserializer:

  • 使用JsonbConfig::withSerializers / JsonbConfig::withDeserializers方法;
  • JsonbSerializer / JsonbDeserializer注释对类型进行注释。

注解不起作用的事实是一个错误。我可以在Yasson 1.0.6上重现它,但不能在Yasson 2.0.0-M1上重现。也许更新到最新版本可以解决您的问题?

© www.soinside.com 2019 - 2024. All rights reserved.