繁体   English   中英

用于第三方库的自定义jackson解串器

[英]Custom jackson deserializer for 3rd party library

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

这是一个代码示例:

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(持续时间,持续时间, int)方法。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM