【问题标题】:Custom jackson deserializer for 3rd party library用于 3rd 方库的自定义 jackson 解串器
【发布时间】:2013-12-12 04:53:40
【问题描述】:

我正在尝试为第三方库中的类编写自定义 Jackson 反序列化器。我已经为其中一个基本类(Duration)制作了一个,但现在我正在尝试为具有 Duration 实例的类(RetryPolicy)编写下一个,但我不太确定如何继续。我想使用我的 Duration 反序列化器,所以我不必重复它的逻辑。

这是一个代码示例:

RetryPolicy rp = 
    new RetryPolicy()
    .withRetryInterval(Duration.seconds(2))
    .withBackoff(Duration.seconds(2), Duration.minutes(30), 2)
    .withMaxDuration(Duration.hours(1))
    .withMaxRetries(100);

正如我所说,我已经有一个 Duration 的反序列化器,如果我创建一个模块并将我的 DurationDeserializer 类添加到它,然后将该模型注册到 ObjectMapper,我似乎几乎能够反序列化以下 JSON:

{
  "retryInterval": "2 seconds",
  "backoff": {
      "retryInterval": "2 seconds", 
      "maxRetryInterval": "5 minutes", 
      "retryIntervalMultiplier": 2
  },
  "maxDuration": "30 minutes",
  "maxRetries": 100
}

我得到的例外是:

Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "backoff" (class net.jodah.lyra.retry.RetryPolicy), not marked as ignorable (5 known properties: , "maxRetries", "maxDuration", "maxRetryInterval", "retryInterval", "retryIntervalMultiplier"])

所以它实际上似乎能够自己填充所有 Duration 和 int 字段(即使这个类使用的是没有 build() 方法的构建器模式。它唯一遇到的问题是 withBackoff(Duration , 持续时间, int) 方法。

我不太确定从这里去哪里。我是否为 RetryPolicy 类编写自定义反序列化程序?如果是这样,我如何避免必须解析所有 JSON(例如,我只想将所有 Duration 变量委托给我已经制作的 DurationDeserializer 类)?

我应该注意(尽管这可能很明显)我无法注释第三方库(Duration 和 RetryPolicy 类),这就是我采用自定义序列化程序方式的原因。

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    有更复杂的方法可以做到这一点,但最简单的方法是查看SerializerProvider(参见defaultSerializeValue())和DeserializationContext(参见findContextualValueDeserializer())中的委托方法:这些对象被传递到您的自定义(反)序列化程序。 因此,您可以将处理委托给为值类型注册的(反)序列化程序。这与您对要处理默认方式的任何类型使用的方法相同(无论映射器配置如何)。

    【讨论】:

    • 我一直在想办法解决这个问题,但我一直碰到什么东西。我已经为 RetryPolicy 类实现了一个反序列化器,但它真的很难看,因为它重复了 Duration 的反序列化逻辑(它甚至不止一次这样做)。这是代码:github.com/StFS/LyraJacksonDeserializers/blob/master/src/main/… 其余代码在同一个项目中,我非常感谢在创建此反序列化器时如何避免代码重复的更多提示。
    • 是的,一般规则是每个级别(和不同的类型)都应该由一个(反)序列化程序处理;并且一切都被委派了。这是可以做到的,核心类型都可以做到。但这并不一定意味着它是微不足道的。
    猜你喜欢
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多