java - 在 DynamoDB 中保存时出现 NullPointerException

标签 java amazon-dynamodb

我有一个带有 idUser 实体

@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/

相关文章:

go - 可以用全局二级索引删除吗?

java - Dropwizard 多个 Assets 包冲突

java - FileInputStream读取文件一直返回0

node.js - 在 AWS Lambda 中使用托管在两个不同区域的两个不同的 AWS 资源?

amazon-dynamodb - addAll 如何与模拟分页查询一起使用

indexing - Dynamodb 单分区、全局二级索引

javascript - 如何将空字符串作为 dynamodb 中字段的值传递?

java - 解析 Microsoft CRM Web API 返回的 Odata 值

java - mouseMoved 给出空异常指针 - 完全困惑(更多 Stanford CS106 痛苦)

java - 无法在匿名类中使用导入的类