Java DynamoDBMappingException:哈希键没有映射-尽管我清楚地映射了它
好的,我看了,我看了。以下是我的具体问题: 我有一个名为“server”的简单DynamoDB表,其中有一个分区键“serverName”。以下表格描述了:Java DynamoDBMappingException:哈希键没有映射-尽管我清楚地映射了它,java,spring-boot,amazon-dynamodb,Java,Spring Boot,Amazon Dynamodb,好的,我看了,我看了。以下是我的具体问题: 我有一个名为“server”的简单DynamoDB表,其中有一个分区键“serverName”。以下表格描述了: "table":{ "attributeDefinitions":[{ "attributeName":"serverName","attributeType":"S" }], "tableName":"server", "keySchema":[{ "attributeNam
"table":{
"attributeDefinitions":[{
"attributeName":"serverName","attributeType":"S"
}],
"tableName":"server",
"keySchema":[{
"attributeName":"serverName","keyType":"HASH"
}],
"tableStatus":"ACTIVE",
"creationDateTime":"Jul 29, 2017 12:46:36 PM",
"provisionedThroughput":{
"numberOfDecreasesToday":0,
"readCapacityUnits":5,
"writeCapacityUnits":5
}
}
我有一个Java表定义,如下所示:
@DynamoDBTable(tableName="server")
public static class Server {
private String serverName;
private Room[] rooms;
Server() {}
Server(String serverName) {
this.serverName = serverName;
this.setRooms();
}
@DynamoDBHashKey(attributeName="serverName")
String getServerName() {
return serverName;
}
void setServerName(String serverName) {
this.serverName = serverName;
}
.
.
.
}
您可以在描述中看到,我有一个HASH属性“serverName”,在Java中的表定义中有一个@DynamoDBHashKey(attributeName=“serverName”)
有人能帮我弄清楚为什么我还是
com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException: Server; no mapping for HASH key
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperTableModel.hashKey(DynamoDBMapperTableModel.java:119) ~[aws-java-sdk-dynamodb-1.11.105.jar!/:na]
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperTableModel$Builder.build(DynamoDBMapperTableModel.java:449) ~[aws-java-sdk-dynamodb-1.11.105.jar!/:na]
at com.amazonaws.services.dynamodbv2.datamodeling.StandardModelFactories$StandardTableFactory.getTable(StandardModelFactories.java:107) ~[aws-java-sdk-dynamodb-1.11.105.jar!/:na]
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.getTableModel(DynamoDBMapper.java:393) ~[aws-java-sdk-dynamodb-1.11.105.jar!/:na]
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.load(DynamoDBMapper.java:431) ~[aws-java-sdk-dynamodb-1.11.105.jar!/:na]
at com.amazonaws.services.dynamodbv2.datamodeling.AbstractDynamoDBMapper.load(AbstractDynamoDBMapper.java:80) ~[aws-java-sdk-dynamodb-1.11.105.jar!/:na]
at com.animationlibationstudios.channel.inventory.persist.dynamodb.ServerDynamoRepository.readServer(ServerDynamoRepository.java:110) ~[classes!/:na]
at com.animationlibationstudios.channel.inventory.persist.dynamodb.ServerDynamoRepository.readServer(ServerDynamoRepository.java:26) ~[classes!/:na]
(另外,我正在使用JDK 8和com.amazonaws:aws java sdk dynamodb:1.11.105)更新 您的“getServerName”方法不是公共的,DynamoDBMapper偶然发现了它。让它公开,它应该起作用:
@DynamoDBHashKey(attributeName="serverName")
public String getServerName() {
return serverName;
}
原始答案:
确保您创建的表具有正确的分区键定义,该分区键定义将“serverName”作为相同类型的分区键
以下是如何做到这一点:
DynamoDBMapper dynamoDBMapper = new DynamoDBMapper(dynamoDB);
CreateTableRequest createTableRequest = dynamoDBMapper.generateCreateTableRequest(itemClass);
// Set your throughput here
createTableRequest.withProvisionedThroughput(new ProvisionedThroughput(1L, 1L));
dynamoDB.createTable(createTableRequest);
表中是否描述了我所包含的内容,但没有说明我是按照您所说的那样创建的?它是通过AWS控制台创建的,而不是通过编程方式创建的,但是描述是通过我的代码读取的,因此表存在并且可以读取-它只是抱怨没有哈希的映射。我明白了,但是这个错误的原因之一可能是表的结构和域类之间不匹配。因此,我建议检查分区密钥是否具有相同的密钥名称、密钥类型和数据类型。哦,不!业余动作!尽管在我的辩护中,IntelliJ“有益地”建议我将方法包设置为私有。现在,我突然遇到了一个非法状态异常:连接池关闭……但最初的错误已得到处理。非常感谢,@Ivan您需要为“getServerName”设置不同的访问修饰符。请参阅我的最新答案。