Java DynamoDBMappingException:哈希键没有映射-尽管我清楚地映射了它

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

好的,我看了,我看了。以下是我的具体问题:

我有一个名为“server”的简单DynamoDB表,其中有一个分区键“serverName”。以下表格描述了:

"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”设置不同的访问修饰符。请参阅我的最新答案。