DynamoDBMappingException:不存在 RANGE 键值

San*_*jee 5 java amazon-web-services amazon-dynamodb

我是NoSQL和的新手Amazon Dynamo DB。我试图首先usernameDynamoDB UserMaster表中检索用户。

我有一个UserMaster包含 5 个属性(usernamecorrect-hashemaillastLoginrole)的表,每种类型String都有一个对应的UsermasterBean映射到该表UserMasterUserMaster表的分区键(Hashkey)是 username并且Sort key(Range Key)correct-hash

用户主控Bean

    @DynamoDBTable(tableName = "UserMaster")
    public class UsermasterBean {
    
    private String username;
    private String correctHash;
    private String email;
    private String lastLogin;
    private String role;
    
    @DynamoDBHashKey(attributeName = "username")
    @DynamoDBAttribute(attributeName = "username")
    public String getUsername() {
        return username;
    }
    
    @DynamoDBRangeKey(attributeName = "correct-hash")
    @DynamoDBAttribute(attributeName = "correct-hash")
    public String getCorrectHash() {
        return correctHash;
    }
    
    @DynamoDBAttribute(attributeName = "email")
    public String getEmail() {
        return email;
    }
    
    @DynamoDBAttribute(attributeName = "last-login")
    public String getLastLogin() {
        return lastLogin;
    }
    
    @DynamoDBAttribute(attributeName = "role")
    public String getRole() {
        return role;
    }
    
    public void setUsername(String username) {
        this.username = username;
    }
    ....
    ....
   }
Run Code Online (Sandbox Code Playgroud)

从 UI 检索数据:

UsermasterBean usermasterBean = new UsermasterBean();
UsermasterDao usermasterDao = new UsermasterDao();

usermasterBean.setUsername(username.getValue()); // Get the username from UI form
final String inputtedPassword = password.getValue(); // Get the password from UI form

UsermasterBean retrievedUserBean = usermasterDao.findByUsernameAndPassword(usermasterBean,inputtedPassword);
Run Code Online (Sandbox Code Playgroud)

验证用户:

public UsermasterBean findByUsernameAndPassword(final UsermasterBean usermasterBean, final String inputtedPassword)
            throws IOException {
        AmazonDynamoDBClientHandler amazonDynamoDBClientHandler = AmazonDynamoDBClientHandler.getNewInstance();
        UsermasterBean retrievedUser;
        try {
            AmazonDynamoDB amazonDynamoDB = amazonDynamoDBClientHandler.createNewClient();
            DynamoDBMapper dynamoDBMapper = new DynamoDBMapper(amazonDynamoDB);
            retrievedUser = dynamoDBMapper.load(usermasterBean.getClass(), usermasterBean.getUsername());
            System.out.println("RETRIEVED CORRECT-HASH FROM DATABASE: " + retrievedUser.getCorrectHash()); // Check if hash retrieved is correct for this user.

            // PasswordUtilityManager.verifyPassword(inputtedPassword,retrievedUser.getCorrectHash());
        } catch (IOException ioException) {
            throw ioException;
        } finally {
            amazonDynamoDBClientHandler.shutdownClient();
        }
        return retrievedUser;
}
Run Code Online (Sandbox Code Playgroud)

问题:

retrievedUser = dynamoDBMapper.load(usermasterBean.getClass(), usermasterBean.getUsername());投掷com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException

我期望retrievedUser.getCorrectHash()应该将存储在数据库中的散列密码显示为 a String,以便我可以验证输入的密码是否创建与从数据库检索到的散列相同的散列。

Chr*_*ams 4

抛出此异常是因为 DynamoDBMapper 也期望传入范围键(因为您的 DynamoDB 表包含范围键correct-hash)。

正确的函数调用应该如下

retrievedUser = dynamoDBMapper.load(usermasterBean.getClass(), usermasterBean.getUsername(), usermasterBean.getCorrectHash());
Run Code Online (Sandbox Code Playgroud)

由于这可能是您的用户密码的哈希值,因此您可以指定用户提供的密码的哈希值副本。如果这在 DynamoDB 中没有返回任何结果,您可以假设他们的用户名或密码不正确。