Can';t通过JavaAPI将属性列表存储到本地dynamoDB
我在本地使用了dynamoDB进行开发,但是如果某些属性是List(例如字符串),如果我使用Set而不是List,那么我就不能在这个DB中存储项,所有的工作都是正确的,但是它破坏了逻辑。您能否澄清这是我的错误或DynamoDB的bug,示例如下:Can';t通过JavaAPI将属性列表存储到本地dynamoDB,java,amazon-web-services,amazon-dynamodb,nosql,Java,Amazon Web Services,Amazon Dynamodb,Nosql,我在本地使用了dynamoDB进行开发,但是如果某些属性是List(例如字符串),如果我使用Set而不是List,那么我就不能在这个DB中存储项,所有的工作都是正确的,但是它破坏了逻辑。您能否澄清这是我的错误或DynamoDB的bug,示例如下: AmazonDynamoDBClient client = new AmazonDynamoDBClient(); client.setEndpoint("http://0.0.0.0:8000"); DynamoDB dyna
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
client.setEndpoint("http://0.0.0.0:8000");
DynamoDB dynamoDB = new DynamoDB(client);
try {
ArrayList<AttributeDefinition> attributeDefinitions = new ArrayList<>();
attributeDefinitions.add(new AttributeDefinition()
.withAttributeName("key")
.withAttributeType("S"));
ArrayList<KeySchemaElement> keySchema = new ArrayList<>();
keySchema.add(new KeySchemaElement()
.withAttributeName("key")
.withKeyType(KeyType.HASH));
CreateTableRequest createTableRequest = new CreateTableRequest()
.withKeySchema(keySchema)
.withAttributeDefinitions(attributeDefinitions)
.withProvisionedThroughput(new ProvisionedThroughput()
.withReadCapacityUnits(1000L)
.withWriteCapacityUnits(100L)); //I know it's now reason for local db
Table table = dynamoDB.createTable(createTableRequest.withTableName("test-list"));
table.waitForActiveOrDelete();
Item correctItem = new Item().withPrimaryKey("key", "1").with("list", new HashSet<>(Arrays.asList("a")));
table.putItem(correctItem);
ScanResult scanResult = client.scan(new ScanRequest().withTableName(table.getTableName()).withScanFilter(Collections.EMPTY_MAP));
for (Map<String, AttributeValue> stringAttributeValueMap : scanResult.getItems()) {
System.out.println(stringAttributeValueMap);
}
Item wrongItem = new Item().withPrimaryKey("key", "2").with("list", Arrays.asList("a"));
table.putItem(wrongItem);
scanResult = client.scan(new ScanRequest().withTableName(table.getTableName()).withScanFilter(Collections.EMPTY_MAP));
for (Map<String, AttributeValue> stringAttributeValueMap : scanResult.getItems()) {
System.out.println(stringAttributeValueMap);
}
} finally {
dynamoDB.getTable("test-list").delete();
}
AmazonDynamoDBClient=newamazondynamodbclient();
client.setEndpoint(“http://0.0.0.0:8000");
DynamoDB DynamoDB=新DynamoDB(客户);
试一试{
ArrayList attributeDefinitions=新的ArrayList();
添加(新的AttributeDefinition()
.withAttributeName(“键”)
.withAttributeType(“S”);
ArrayList keySchema=新的ArrayList();
添加(新的KeySchemaElement()
.withAttributeName(“键”)
.withKeyType(KeyType.HASH));
CreateTableRequest CreateTableRequest=新建CreateTableRequest()
.withKeySchema(keySchema)
.withAttributeDefinitions(attributeDefinitions)
.withProvisionedThroughput(新的ProvisionedThroughput()
.带读取容量(1000L)
.withWriteCapacityUnits(100L));//我知道这是本地数据库的原因
Table Table=dynamoDB.createTable(createTableRequest.withTableName(“测试列表”));
table.waitForActivieOrDelete();
Item correctItem=new Item()。带primaryKey(“key”,“1”)。带(“list”,新哈希集(Arrays.asList(“a”));
表2.1项目(更正项目);
ScanResult ScanResult=client.scan(新的ScanRequest().withTableName(table.getTableName()).withScanFilter(Collections.EMPTY_MAP));
对于(映射stringAttributeValueMap:scanResult.getItems()){
System.out.println(stringAttributeValueMap);
}
Item ErrorItem=new Item().withPrimaryKey(“key”,“2”)。with(“list”,Arrays.asList(“a”);
表2.putItem(错误项);
scanResult=client.scan(新的ScanRequest().withTableName(table.getTableName()).withScanFilter(Collections.EMPTY_MAP));
对于(映射stringAttributeValueMap:scanResult.getItems()){
System.out.println(stringAttributeValueMap);
}
}最后{
dynamoDB.getTable(“测试列表”).delete();
}
注释
- Java版本是:1.7.0\u 71
- AWS sdk版本:AWS java sdk dynamodb:1.9.24
- 本地发电机:发电机2013-12-12
- DynamoDBLocal由以下命令启动:
java-Djava.library.path=./DynamoDBLocal\u lib-jar DynamoDBLocal.jar
newhashset(Arrays.asList(“a”)
更改为Collections.singletonList(“a”)
我对最新版本的DynamoDB local版本运行了相同的代码,该版本当前为DynamoDB_local_2015-01-27。我使用的两个命令都是java-Djava.library.path=./DynamoDBLocal\u lib-jar DynamoDBLocal.jar-inMemory-port 8000
这就是输出:
{list={L:[{S:a,}],},key={S:1,}}
{list={L:[{S:a,}],},key={S:1,}}
{list={L:[{S:a,}],},key={S:2,}}
这看起来是DynamoDB Local版本的一个bug。您应该下载DynamoDB local的最新版本,该版本似乎已修复。谢谢,我从本文中获取了DynamoDB,但错过了该版本,因为该版本太旧了
Exception in thread "main" com.amazonaws.AmazonServiceException: The request processing has failed because of an unknown error, exception or failure. (Service: AmazonDynamoDBv2; Status Code: 500; Error Code: InternalFailure; Request ID: ddce50a5-4e56-4769-9d9e-9e23a3b2dc92)
at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1078)
at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:726)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:461)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:296)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:3139)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.putItem(AmazonDynamoDBClient.java:1214)
at com.amazonaws.services.dynamodbv2.document.internal.PutItemImpl.doPutItem(PutItemImpl.java:87)
at com.amazonaws.services.dynamodbv2.document.internal.PutItemImpl.putItem(PutItemImpl.java:41)
at com.amazonaws.services.dynamodbv2.document.Table.putItem(Table.java:138)