【发布时间】: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 类),这就是我采用自定义序列化程序方式的原因。
【问题讨论】: