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
相关产品推荐
相关产品推荐

