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表,而不需要排序列