我有一个带有 id
的 User
实体
@DynamoDBTable(tableName = "User")
public class User {
...
@DynamoDBHashKey(attributeName = "id")
@DynamoDBAutoGeneratedKey
public String getId() {
...
}
// other attributes, getters and setters omitted for simplicity
...
}
和一个User
表,其键名为id
,类型为S
final ArrayList<KeySchemaElement> keySchema = new ArrayList<KeySchemaElement>();
keySchema.add(new KeySchemaElement().withAttributeName(pKeyName).withKeyType(KeyType.HASH));
final ArrayList<AttributeDefinition> attributeDefinitions = new ArrayList<AttributeDefinition>();
attributeDefinitions.add(new AttributeDefinition().withAttributeName(pKeyName).withAttributeType(pKeyType));
final CreateTableRequest request = new CreateTableRequest().withTableName(pTableName).withKeySchema(keySchema)
.withProvisionedThroughput(new ProvisionedThroughput().withReadCapacityUnits(10L).withWriteCapacityUnits(5L));
request.setAttributeDefinitions(attributeDefinitions);
关于执行“保存”操作
public <S extends User> S save(final S pUser) {
mapper.save(pUser);
return pUser;
}
我从 DBMapper 代码中收到 NullPointerException
java.lang.NullPointerException: null
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper$SaveObjectHandler.doPutItem(DynamoDBMapper.java:883) ~[aws-java-sdk-dynamodb-1.11.295.jar!/:na]
...
at com.amazonaws.services.dynamodbv2.datamodeling.AbstractDynamoDBMapper.save(AbstractDynamoDBMapper.java:123) ~[aws-java-sdk-dynamodb-1.11.295.jar!/:na]
at hello.user.repository.UserRepository.save(UserRepository.java:85) ~[classes!/:0.1.0]
我的用户对象不是 null
,除了自动生成的 id
之外,它的任何属性也不是 null。知道发生了什么吗?
是否是 null id 导致了异常?这不是我所期望的 @DynamoDBAutoGenerateKey
的工作方式吗?根据文档和示例
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Annotations.html#DynamoDBMapper.Annotations.DynamoDBAutoGeneratedKey
这应该是它的工作原理
最佳答案
这不是因为 null
属性值。
问题在于时间安排,或者更确切地说,是顺序问题。 NullPointerException 发生在 doPutItem(DynamoDBMapper.java:883)
中。查看源代码,该行是
883 return db.putItem(applyUserAgent(req));
这意味着 db
为空。
db
是一个成员变量
191 private final AmazonDynamoDB db;
并且它在构造函数中初始化
public DynamoDBMapper(
final AmazonDynamoDB dynamoDB,
final DynamoDBMapperConfig config,
final AttributeTransformer transformer,
final AWSCredentialsProvider s3CredentialsProvider) {
super(config);
...
this.db = dynamoDB;
...
}
因此,db
是您在创建映射器时传递的 AmazonDynamoDB
客户端实例。
在 Spring 上下文中,如果在向客户端提供 (@Autowired
) 值之前构造映射器,则该值将为 null。
确保 AmazonDynamoDB
客户端和 DynamoDBMapper
的创建顺序正确,一切都会好起来的
关于java - 在 DynamoDB 中保存时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49307196/