【发布时间】:2021-01-06 17:33:58
【问题描述】:
我正在使用只能使用构建器创建的第三方 POJO 类 RetryOptions。只能使用静态方法 RetryOptions.newBuilder() 或通过在现有实例上调用 options.toBuilder() 来实例化构建器。
我想为第三方 POJO (RetryOptions) 创建自定义反序列化器。我的第一种方法是将对象编写为构建器,然后将对象读取为构建器并返回构建结果:
class RetryOptionsSerializer extends StdSerializer<RetryOptions> {
@Override
public void serialize(RetryOptions value, JsonGenerator gen, SerializerProvider provider) throws IOException {
// Save as a builder
gen.writeObject(value.toBuilder());
}
}
class RetryOptionsDeserializer extends StdDeserializer<RetryOptions> {
@Override
public RetryOptions deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
// Read as builder, then build
return p.readValueAs(RetryOptions.Builder.class).build();
}
}
但问题是 Jackson 不知道如何创建 RetryOptions.Builder 的实例以填充其字段。
有没有一种方法可以指导 Jackson 如何创建构建器实例,但让 Jackson 处理字段的解析、反射和分配?
可能是这样的:
class RetryOptionsDeserializer extends StdDeserializer<RetryOptions> {
@Override
public RetryOptions deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
// Read as builder, then build
var builder = RetryOptions.newBuilder();
return p.readValueInto(builder).build();
}
}
或者也许有一种方法可以告诉对象映射器如何创建RetryOptions.Builder 的实例:
var mapper = new ObjectMapper();
mapper.registerValueInstantiator(RetryOptions.Builder, () -> RetryOptions.newBuilder());
或者是否有另一种方法来解决这个问题,而不求助于我自己的反射逻辑或第三方类的暴力复制?
注意:我的解决方案必须使用 Jackson JSON 库(没有 Guava 等)
注意:这个第三方库中有几个类遇到了同样的问题,所以一个通用的解决方案很有帮助
【问题讨论】: