DynamoDB + Quarkus - 奇数类型转换
DynamoDB + Quarkus - Odd type conversion
我在 DynamoDB 上有一个 table / 实体,应该用数字作为字段进行映射。
示例:
@RegisterForReflection
Foo {
Integer myfield;
...
}
我注意到 quarkus-amazon-dynamodb 依赖使用的 AWS SDK 是以一种奇怪的方式构建的。
例如software.amazon.awssdk.services.dynamodb.model.AttributeValue
的n()方法
return 一个 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();
我错过了什么吗?
PS
Quarkus dynamoDB 文档是 here
这并不奇怪 - 这就是 AWS DynamoDB 的工作原理。数字在 DynamoDB 中表示为字符串,而 Quarkus 与此无关。见 API reference:
N
An attribute of type Number. For example:
"N": "123.45"
Numbers are sent across the network to DynamoDB as strings, to
maximize compatibility across languages and libraries. However,
DynamoDB treats them as number type attributes for mathematical
operations.
Type: String
我在 DynamoDB 上有一个 table / 实体,应该用数字作为字段进行映射。
示例:
@RegisterForReflection
Foo {
Integer myfield;
...
}
我注意到 quarkus-amazon-dynamodb 依赖使用的 AWS SDK 是以一种奇怪的方式构建的。
例如software.amazon.awssdk.services.dynamodb.model.AttributeValue
的n()方法return 一个 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();
我错过了什么吗?
PS
Quarkus dynamoDB 文档是 here
这并不奇怪 - 这就是 AWS DynamoDB 的工作原理。数字在 DynamoDB 中表示为字符串,而 Quarkus 与此无关。见 API reference:
N
An attribute of type Number. For example:"N": "123.45"
Numbers are sent across the network to DynamoDB as strings, to maximize compatibility across languages and libraries. However, DynamoDB treats them as number type attributes for mathematical operations.
Type: String