gpt4 book ai didi

java - 将 Jackson 与具有私有(private) Builder 的不可变类一起使用

转载 作者:行者123 更新时间:2023-12-02 13:16:29 24 4
gpt4 key购买 nike

我正在尝试序列化/反序列化 DynamoDB V2 AttributeValue使用 jackson 上课。
它被设置为具有 Builder 的不可变类,并且 builder 具有私有(private)构造函数。要创建构建器,您需要调用 AttributeValue.builder() .
我无法控制这个类,所以我想使用 Jackson mixins。
我用过@JsonDeserialize(builder = AttributeValue.Builder::class)并注册了mixin:

@JsonDeserialize(builder = AttributeValue.Builder::class)
interface AttributeValueMixin {
}

private val mapper = jacksonObjectMapper()
.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY)
.addMixIn(AttributeValue::class.java, AttributeValueMixin::class.java)

然而,Jackson 正在尝试使用 AttributeValue.Builder 的默认构造函数。它不能,因为它没有。

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of software.amazon.awssdk.services.dynamodb.model.AttributeValue$Builder (no Creators, like default construct, exist)


我怎样才能让 jackson 使用 AttributeValue.builder()工厂功能?或关于如何使用 Jackson 序列化/反序列化此 AttributeValue 的任何其他想法类(class)?

最佳答案

确实很棘手。我可以想到两个解决方案:

  • 在原始构建器周围创建一个包装器:

  • class BuilderDelegate {

    var field1 : String? = null
    var field2 : String? = null
    ...

    fun build() = AttributeValue.builder().also {
    it.field1 = field1
    it.field2 = field2
    ...
    }.build()
    }

    @JsonDeserialize(builder = BuilderDelegate::class)
    interface AttributeValueMixin {
    }
  • 如果您直接调用对象映射器,您可以尝试以下 hack:

  • val builder = mapper.readerForUpdating(AttributeValue.builder())
    val value = builder.readValue<AttributeValue.Builder>(jsonData).build()

    关于java - 将 Jackson 与具有私有(private) Builder 的不可变类一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63400344/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com