Java DynamoDBMappingException:不存在范围键值

Java DynamoDBMappingException:不存在范围键值,java,amazon-web-services,amazon-dynamodb,Java,Amazon Web Services,Amazon Dynamodb,我不熟悉NoSQL和Amazon Dynamo DB。我试图通过username首先从DynamoDBUserMaster表中检索用户 我有一个表UserMaster,有5个属性(username,correct hash,email,lastLogin,role),每种类型String,我有一个对应的UsermasterBean映射到表UserMasterUserMaster表的分区键(Hashkey)是username和Sort键(Range键)是correct hash Usermaste

我不熟悉
NoSQL
Amazon Dynamo DB
。我试图通过
username
首先从
DynamoDB
UserMaster
表中检索用户

我有一个表
UserMaster
,有5个属性(
username
correct hash
email
lastLogin
role
),每种类型
String
,我有一个对应的
UsermasterBean
映射到表
UserMaster
UserMaster
表的分区键(Hashkey)是
username
Sort键(Range键)
correct hash

UsermasterBean

    @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;
    }
    ....
    ....
   }
从用户界面检索数据:

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);
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;
}
验证用户:

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);
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;
}
问题:

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);
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;
}
retrievedUser=dynamoDBMapper.load(usermasterBean.getClass(),usermasterBean.getUsername())抛出
com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException


我期待
retrievedUser.getCorrectHash()
应将存储在数据库中的哈希密码显示为
字符串,以便我可以验证输入的密码是否创建了与从数据库检索到的哈希相同的哈希值。

由于DynamoDBMapper也希望传递范围键,因此引发此异常(因为DynamoDB表包含一个范围键
正确的哈希值

正确的函数调用应如下所示

retrievedUser = dynamoDBMapper.load(usermasterBean.getClass(), usermasterBean.getUsername(), usermasterBean.getCorrectHash());

由于这可能是用户密码的散列,您可以指定用户提供的密码的散列副本。如果这在DynamoDB中没有返回结果,您可以假定他们的用户名或密码不正确。

根据您的数据模型,
UserMaster
表中可以有多个条目用于单个用户呃(
username
),这不是您的意图。(为什么一个用户会有两个哈希密码?)

不要将
correctHash
建模为范围键。如果这样做,DynamoDB会要求您在调用
load
时同时提供哈希键和范围键(否则您必须
查询


请参阅:

Chris,根据您的建议,
retrievedUser=dynamoDBMapper.load(usermasterBean.getClass(),usermasterBean.getUsername(),usermasterBean.getCorrectHash())
-引发相同的异常,因为我仍然没有
正确的哈希值
将其传递给load方法,除非我从数据库中获取它。这就是为什么,我想通过
用户名
检索
正确的哈希值
&检查输入的密码是否创建了与数据库检索到的相同的
正确的哈希值。
当我硬编码
correct hash
来测试它时,正确的方法是什么?如果你能够对
inputedpassword
进行hash,并将其传入,那么如果它没有返回结果,你就知道凭据不匹配。或者,你需要创建一个新的DynamoDB表,而不需要排序列