DynamoDB + Quarkus - 奇数类型转换

Posted

技术标签:

【中文标题】DynamoDB + Quarkus - 奇数类型转换【英文标题】:DynamoDB + Quarkus - Odd type conversion 【发布时间】:2022-01-18 12:41:15 【问题描述】:

我在 DynamoDB 上有一个表/实体,应该用数字作为字段进行映射。

例子:

@RegisterForReflection
Foo 
     Integer myfield;
     ...

我注意到 quarkus-amazon-dynamodb 依赖项使用的 AWS 开发工具包是以一种奇怪的方式构建的。

例如software.amazon.awssdk.services.dynamodb.model.AttributeValue的n()方法

返回 java String 而不是 Number 类型,所以我必须用笨拙的 Integer.parseInt()

public static Foo from(Map<String, AttributeValue> item) 
    final var output = new Foo();
    if (item != null && !item.isEmpty()) 
        output.setMyField(Integer.parseInt(item.get(MY_FIELD).n()));
    
    return output;

如果我必须获取一个项目并使用,也会发生同样的情况

AttributeValue.builder().n()

final Map<String, AttributeValue> key = new HashMap<>();
    key.put(Foo.MY_FIELD, AttributeValue.builder().n(input.toString()).build()); // too bad!!

    return GetItemRequest.builder()
            .tableName(TABLE_NAME)
            .key(key)
            .attributesToGet(Foo.MY_FIELD)
            .build();

我错过了什么吗?

附言

Quarkus dynamoDB 文档是here

【问题讨论】:

【参考方案1】:

这并不奇怪 - 这正是 AWS DynamoDB 的工作原理。数字在 DynamoDB 中表示为字符串,而 Quarkus 与此无关。见API reference:

N Number 类型的属性。例如:

“N”:“123.45”

数字作为字符串通过网络发送到 DynamoDB,以 最大限度地提高跨语言和库的兼容性。然而, DynamoDB 将它们视为数学的数字类型属性 操作。

类型:字符串

【讨论】:

以上是关于DynamoDB + Quarkus - 奇数类型转换的主要内容,如果未能解决你的问题,请参考以下文章

Quarkus 找不到内容类型多部分/表单数据休息客户端的编写器

带和/或不带类型的 AWS DynamoDB 数据?

DynamoDB 最高效的日期类型

DynamoDB中时间戳的数据类型[重复]

具有 CloudFormation 的 Amazon DynamoDB 属性类型

用于DynamoDB batchWrite调用的EC2主机类型。