You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中AmazonDynamoDBLockClient使用及ownerName空指针问题排查

解决AmazonDynamoDBLockClient获取锁时的ownerName空指针异常

问题描述

本地运行DynamoDB,使用AmazonDynamoDBLockClient获取锁时抛出空指针异常:

Cannot invoke "software.amazon.awssdk.services.dynamodb.model.AttributeValue.s()" because "ownerName" is null

解决思路

1. 验证锁表结构的正确性

  • 确保DynamoDB锁表存在,且包含owner_name字符串类型属性。若手动创建表,需确认该字段存在;若由客户端自动创建表,可删除现有表后让客户端重新生成,再检查表结构是否包含owner_name。
  • 注意:如果自定义了owner字段名(通过withOwnerNameAttribute方法),要确保表中对应的字段名与配置一致。

2. 确认Client配置的ownerName是否生效

虽然代码中调用了withOwnerName("app"),但需验证配置是否被正确加载:

@Bean
public AmazonDynamoDBLockClient amazonDynamoDBLockClient(){
    AmazonDynamoDBLockClientOptions options = AmazonDynamoDBLockClientOptions
        .builder(dynamoDbClient(), "table-name")
        .withPartitionKeyName("partition-key-name")
        .withOwnerName("app")
        .withTimeUnit(TimeUnit.SECONDS)
        .withLeaseDuration(10L)
        .withHeartbeatPeriod(3L)
        .withCreateHeartbeatBackgroundThread(true)
        .build();
    // 打印验证ownerName是否为预期值
    System.out.println("Configured OwnerName: " + options.getOwnerName());
    return new AmazonDynamoDBLockClient(options);
}
  • 若打印结果为null,说明Bean创建逻辑存在问题(如配置类未被Spring扫描、存在多个Client Bean导致覆盖等)。

3. 在AcquireLockOptions中显式指定ownerName

尝试在获取锁时直接指定ownerName,绕过Client级配置的潜在问题:

public Optional<LockItem> acquireLock(){
    return amazonDynamoDBLockClient.tryAcquireLock(AcquireLockOptions.builder("partitionKey")
        .withOwnerName("app")
        .build());
}
  • 若此方法能正常获取锁,说明Client级的ownerName配置未被正确应用,需排查Bean创建流程。

4. 排查依赖版本冲突

使用mvn dependency:tree查看项目依赖树,确认dynamodb-lock-client(1.2.0)与aws-sdk-dynamodb的版本兼容。若存在多版本冲突,需排除旧版本依赖,确保二者版本匹配。

5. 检查DynamoDbClient的配置完整性

确保DynamoDbClient配置正确,能正常连接本地DynamoDB:

@Bean
public DynamoDbClient dynamoDbClient(){
    return DynamoDbClient.builder()
           .endpointOverride(URI.create("http://localhost:8000"))
           .region(Region.US_EAST_1) // 需指定区域,即使是本地环境
           .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create("dummy", "dummy"))) // 本地DynamoDB需要虚拟凭证
           .build();
}
  • 本地DynamoDB需要指定区域和虚拟凭证,否则可能导致客户端初始化异常,间接引发ownerName相关问题。

内容的提问来源于stack exchange,提问作者Saurabh Thakur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 09:13:23