Lombok注解与DynamoDB注解搭配使用

8

我有一个类似于 DAO 的东西:

    @Getter
    @Setter
    @DynamoDBTable(tableName="tableName")
    public class DAO {
        @DynamoDBHashKey
        private String field1;

        @DynamoDBIndexHashKey(globalSecondaryIndexName="index_name")
        @DynamoDBRangeKey
        private String field2;
    }

问题在于,当我试图使用DAO通过DynamoDBMapper进行负载调用时,使用field1作为哈希键获取项目时,它会抛出一个DynamoDBException,显示:Null key found for public DAO.getField2(),但实际上表中有与field2相对应的值。 问题是,这是否是由于Lombok注释而不是手动设置代码以及我们通常同时使用Lombok和DynamoDBAnnotations所致?


我没有使用过Lombok,但我不认为它会引起问题。听起来你只是使用了项目的hashKey:你调用了哪个DynamoDBMapper方法(哪个DynamoDB API)? - mkobit
我正在使用load()方法。实际上,我发现当哈希键和范围键组合时会出现这种情况,load需要将两者都传递给表来进行请求。因此,在这种情况下需要使用query(),因为它允许仅对哈希键进行查询。这对我很有效。因此,由于我们可以直接注释DAO字段,所以lombok与DynamoDB注释一起使用效果很好。 - user506591
是的,这正是我猜测的。Lombok 应该在所有魔法之前完成其工作,而 DynamoDBMapper 仍应该可以访问所有注释。我认为它仍然有效的方式是您应该注释 getters/setters 或注释字段,但不要混合使用两者。最终会调用 GetItem,它需要两者,这就是为什么您在 Mapper 中会遇到那个错误的原因。很高兴看到你解决了这个问题! - mkobit
1个回答

5

这里有一些解释和TL;DR

您正在调用load方法,该方法映射到GetItem调用。 DynamoDBMapper试图基于您的注释来映射该请求。您的类具有@DynamoDBRangeKey注释,并且GetItem调用需要完整的主键才能获取项,这意味着映射器将为对象构建主键。

由于Lombok已经在运行之前生成了您的代码,因此它不会影响您已经放置的注释。而且由于您的注释是应用于字段而不是应用于getter,因此映射器调用了生成的Lombok getter。然而,当它尝试序列化成请求时,该getter返回null,因为您只设置了hashKey。

TL;DR: load()转换为GetItem API,需要同时具备hashKey和rangeKey,因为两个注释都存在于您的类中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接