【问题标题】:NullPointerException on save in DynamoDB在 DynamoDB 中保存时出现 NullPointerException
【发布时间】:2018-03-17 01:42:15
【问题描述】:

我有一个User 实体和一个id

@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,它是自动生成的。知道发生了什么吗?

空 id 是否导致异常?这不是我应该期望@DynamoDBAutoGeneratedKey 工作的方式吗?根据文档和示例 https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Annotations.html#DynamoDBMapper.Annotations.DynamoDBAutoGeneratedKey 应该是这样的

【问题讨论】:

  • “更新”使上面的所有内容无效。请重写帖子以提出真正的问题。您可能应该删除它,然后 edit 它然后取消删除以避免投票/关闭投票。
  • 您有id 的二传手吗?也许你需要一个?
  • @JimGarrison,已经清理了这个问题。它仍然存在。保存时会出现 NullPointerException,并且库和文档都特别有助于说明原因。
  • @Rohan,我有一个简单的 ID 公开设置器。为简单起见,我从问题中省略了它

标签: java amazon-dynamodb


【解决方案1】:

这不是因为 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 的创建顺序正确,一切都会好起来的

【讨论】:

  • 在我的例子中,AmazonDynamoDBDynamoDBMapper 实例是作为 bean 创建的,并且映射器是在创建 db 实例之前创建的。将@DependsOn 添加到mapper bean 创建解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 2013-06-29
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多