枚举上忽略 JSON 绑定 @JsonbTypeDeserializer 注释?

2024-04-16

我正在将 JAXB 应用程序转换为JSON-B http://json-b.net/docs/user-guide.html我在尝试使用自定义反序列化 Java 枚举时遇到了问题JsonbDeserializer在我的一项测试中。

我需要反序列化的原始 JSON 包含ints 引用枚举常量。因此我的习惯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自动注册注释?考虑到我有很多枚举需要自定义反序列化器,手动注册它们确实无法扩展。

EDIT 1:我尝试过使用@JsonbCreator-注释的静态方法代替,结果是一样的。仍然使用默认的枚举反序列化器。


JSON-B 规范提到了注册自定义反序列化器的两种方法:

注册JsonbSerializer/JsonbDeserializer有两种方式:

  • Using JsonbConfig::withSerializers/JsonbConfig::withDeserializers method;
  • 用注释类型JsonbSerializer/JsonbDeserializer注解。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

枚举上忽略 JSON 绑定 @JsonbTypeDeserializer 注释? 的相关文章

随机推荐