将 Jackson 与不可变的 AWS V2 DDB AttributeValue 和私有生成器一起使用?

Mat*_*ein 6 java json jackson kotlin amazon-dynamodb

我正在尝试使用 Jackson 序列化/反序列化DynamoDB V2 AttributeValue类。

它被设置为带有构建器的不可变类,并且构建器有一个私有构造函数。为了创建构建器,您需要调用AttributeValue.builder().

我无法控制这个类,所以我想使用 Jackson mixin。

我已经使用@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)

Run Code Online (Sandbox Code Playgroud)

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

com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造实例software.amazon.awssdk.services.dynamodb.model.AttributeValue$Builder(不存在创建者,如默认构造)

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

Mat*_*ein 1

所以这感觉完全是 jankey,但它有效,所以... \xc2\xaf\\ (\xe3\x83\x84) /\xc2\xaf

\n

对于我的情况,我需要序列化/反序列化Map<String, AttributeValue>,因此我使用了一种技术,将映射的 JSON 版本填充到“map”属性中,反序列化,然后提取“map”值:

\n
import com.fasterxml.jackson.databind.ObjectMapper\n\n// the Jackson mapper\nval mapper = ObjectMapper()\n    // I don't remember if this was needed, but I assume so...\n    .setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY)\n    // This is probably just to make the JSON smaller\n    .setSerializationInclusion(JsonInclude.Include.NON_EMPTY)\n\n// to JSON\nval dynamoAttributes: Map<String, AttributeValue> = ... \nval attributesAsJson = mapper.writeValueAsString(dynamoAttributes)\n\n// read back from JSON\nval result: Map<String, AttributeValue> =\n    mapper.readValue(\n        """{"m":$attributesAsJson}""", // stuff the JSON into a map field\n        AttributeValue.serializableBuilderClass())\n    .build()\n    .m() // extract the "strongly" typed map\n
Run Code Online (Sandbox Code Playgroud)\n