2017-07-30 87 views
1

好吧,所以我查看了this post,我查看了this other post。這是我的具體問題:DynamoDBMappingException:沒有HASH鍵的映射 - 儘管我清楚地映射了它

我有一個簡單的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; 
    } 
    . 
    . 
    . 
} 

您可以在描述我的「服務器名」散列屬性,並在我的表定義見在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 PS:AWS-Java的SDK-dynamodb:1.11 .105)

+1

您需要設置不同的訪問修飾符爲「getServerName」。看到我更新的答案。 –

回答

2

UPDATE

你 「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); 
+0

表格中是否包含我沒有說明的內容,正如您所說的那樣創建它?它是通過AWS控制檯創建的,而不是通過編程方式創建的,但是通過我的代碼讀取了描述,因此表格存在並且可以被讀取 - 它只是抱怨沒有用於哈希的映射。 – RobA

+1

我明白了,但這個錯誤的原因之一可能是表的結構和你的域類之間的不匹配。因此,我建議檢查您的分區密鑰是否具有相同的密鑰名稱,相同的密鑰類型和相同的數據類型。 –

+0

哦,不!業餘動作!儘管在我的防守中,IntelliJ「有用地」建議我使包私有方法成爲可能。我現在已經進入了一個IllegalStateException:連接池關閉了......但是原來的錯誤已經被處理了。非常感謝@ivan – RobA